在许多其他编程语言中,有一个函数将正则表达式作为参数,并返回字符串值数组 . 这适用于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 回答
它将尝试匹配
/[a-z]+/i
正则表达式的字符串,如果匹配,将输出组0,即整个匹配 . 请注意,如果找不到匹配项,[...]
之后的?
将使其正常失败 . 如果您只使用puts "??!!"[/[a-z]+/i]
,则会抛出异常 .见this online demo .
如果您希望功能类似于返回 all matches found in the input 的
String#scan
,您可以使用(缩写版本仅按@Amadan's remark保留):输出code above:
注意:
String::scan将为每个匹配返回一个Regex::MatchData数组 .
您可以在匹配项上调用.string以返回实际匹配的文本 .
实际上,发布的示例在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):