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

在许多其他编程语言中,有一个函数将正则表达式作为参数,并返回字符串值数组 . 这适用于Javascript和Ruby . 然而,晶体中的 .match 确实1)似乎不接受全局标志和2)它不返回数组而是返回类型 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

返回 Regex::MatchData("Happy")

我不确定如何将此结果转换为字符串或为什么这不是默认值,因为它在灵感语言(Ruby)中 . 我理解这个问题可能是因为我处理结构和编译语言的经验不足,但我希望得到一个答案,希望它也可以帮助其他来自JS / Ruby背景的人 .

回答(2)

2 years ago

如果我只想在第一场比赛中转换为字符串怎么办?

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 .

如果您希望功能类似于返回 all matches found in the inputString#scan ,您可以使用(缩写版本仅按@Amadan's remark保留):

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

输出code above

["Happy days", "Happy days"]

注意:

2 years ago

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

如果您只需要一次匹配而不通过 Regex::MatchData ,则可以使用[String#](https://crystal-lang.org/api/0.25.1/String.html#%5B%5D%28regex%3ARegex%2Cgroup%29-instance-method):

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