如何访问 .match 的结果作为 Crystal lang 中的字符串值

How to access the results of .match as string value in Crystal lang

在许多其他编程语言中,有一个函数将正则表达式作为参数,returns 是一个字符串值数组。 Javascript 和 Ruby 也是如此。然而,crystal 中的 .match 确实 1) 似乎不接受全局标志,并且 2) 它不是 return 数组而是 Regex::MatchData 类型的结构。 (https://crystal-lang.org/api/0.25.1/Regex/MatchData.html)

例如以下代码:

str = "Happy days"
re = /[a-z]+/i
matches = str.match(re)
puts matches

returns Regex::MatchData("Happy")

我不确定如何将此结果转换为字符串,或者为什么这不是灵感语言 (Ruby) 中的默认值。我知道这个问题可能是由于我在处理结构和编译语言方面缺乏经验,但我很感激你的回答,希望它也能帮助来自 JS/Ruby 背景的其他人。

What if I want to convert to a string merely the first match?

puts "Happy days"[/[a-z]+/i]?
puts "Happy days".match(/[a-z]+/i).try &.[0]

它将尝试将一个字符串与 /[a-z]+/i 正则表达式进行匹配,如果有匹配项,将输出第 0 组,即整个匹配项。请注意,如果未找到匹配项,[...] 之后的 ? 将使它优雅地失败。如果直接使用puts "??!!"[/[a-z]+/i],会抛出异常

参见 this online demo

如果您想要类似于 String#scan 的功能,即 returns 在输入 中找到的所有匹配项,您可以使用(缩写版本仅保留为每 ):

matches = str.scan(re).map(&.string)

code above 的输出:

["Happy days", "Happy days"]

注意:

实际上发布的示例 returns Ruby 中的 #<MatchData "Happy">,它也没有 "global" 标志 - 这就是 String#scan(Regex) 所提到的其他

如果您只想匹配而不需要经过Regex::MatchData,您可以使用String#[](Regex):

str = "Happy days"
p str[/[a-z]+/i] # => "Happy"