如何访问 .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"]
注意:
每场比赛 String::scan
will return an array of Regex::MatchData
。
- 您可以在匹配上调用
.string
以 return 实际匹配的文本。
实际上发布的示例 returns Ruby 中的 #<MatchData "Happy">
,它也没有 "global" 标志 - 这就是 String#scan(Regex)
所提到的其他
如果您只想单匹配而不需要经过Regex::MatchData
,您可以使用String#[](Regex)
:
str = "Happy days"
p str[/[a-z]+/i] # => "Happy"
在许多其他编程语言中,有一个函数将正则表达式作为参数,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"]
注意:
-
每场比赛
String::scan
will return an array ofRegex::MatchData
。- 您可以在匹配上调用
.string
以 return 实际匹配的文本。
实际上发布的示例 returns Ruby 中的 #<MatchData "Happy">
,它也没有 "global" 标志 - 这就是 String#scan(Regex)
所提到的其他
如果您只想单匹配而不需要经过Regex::MatchData
,您可以使用String#[](Regex)
:
str = "Happy days"
p str[/[a-z]+/i] # => "Happy"