Sha*_*375 4 regex matching crystal-lang
在许多其他编程语言中,有一个函数将正则表达式作为参数并返回字符串值数组。Javascript 和 Ruby 都是如此。然而, in .matchcrystal 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
Run Code Online (Sandbox Code Playgroud)
回报Regex::MatchData("Happy")
我不确定如何将此结果转换为字符串,或者为什么这不是灵感语言(Ruby)中的默认值。我知道这个问题可能是由于我在处理结构和编译语言方面缺乏经验造成的,但我希望得到一个答案,希望它也可以帮助来自 JS/Ruby 背景的其他人。
如果我只想将第一个匹配项转换为字符串怎么办?
puts "Happy days"[/[a-z]+/i]?
puts "Happy days".match(/[a-z]+/i).try &.[0]
Run Code Online (Sandbox Code Playgroud)
它将尝试将字符串与/[a-z]+/i正则表达式进行匹配,如果有匹配,则将输出组 0,即整个匹配。请注意,如果未找到匹配项,则?后面的操作将使其正常失败。[...]如果你只使用puts "??!!"[/[a-z]+/i],将会抛出异常。
请参阅此在线演示。
String#scan如果您想要类似于返回输入中找到的所有匹配项的功能,您可以使用(根据@Amadan的评论仅留下缩短版本):
str = "Happy days"
re = /[a-z]+/i
matches = [] of String
str.scan(re) do |match|
matches << match[0]
end
puts matches
Run Code Online (Sandbox Code Playgroud)
上面代码的输出:
["Happy", "days"]
Run Code Online (Sandbox Code Playgroud)
请注意,将为每个匹配String::scan返回一个数组。Regex::MatchData要获取匹配的文本,只需访问匹配对象中的第一项即可。
更短的方法是使用
matches = str.scan(re).map(&.to_a).flatten
Run Code Online (Sandbox Code Playgroud)
请参阅在线演示。
| 归档时间: |
|
| 查看次数: |
1075 次 |
| 最近记录: |