Regex 如何在Crystal lang中以字符串值的形式访问.match的结果
在许多其他编程语言中,有一个函数将正则表达式作为参数,并返回字符串值数组。Javascript和Ruby也是如此。然而,crystal中的Regex 如何在Crystal lang中以字符串值的形式访问.match的结果,regex,matching,crystal-lang,Regex,Matching,Crystal Lang,在许多其他编程语言中,有一个函数将正则表达式作为参数,并返回字符串值数组。Javascript和Ruby也是如此。然而,crystal中的.match1)似乎不接受全局标志,2)它不返回数组,而是返回类型为Regex::MatchData的结构。() 以下代码作为示例: str = "Happy days" re = /[a-z]+/i matches = str.match(re) puts matches 返回Regex::MatchData(“Happy”) 我不确定如何将这个结果转换成
.match
1)似乎不接受全局标志,2)它不返回数组,而是返回类型为Regex::MatchData
的结构。()
以下代码作为示例:
str = "Happy days"
re = /[a-z]+/i
matches = str.match(re)
puts matches
返回Regex::MatchData(“Happy”)
我不确定如何将这个结果转换成字符串,或者为什么这不是灵感语言(Ruby)中的默认值。我理解这个问题可能是因为我缺乏处理结构和编译语言的经验,但我希望能得到一个答案,希望它也能帮助来自JS/Ruby背景的其他人
如果我只想将第一个匹配项转换为字符串,该怎么办 它将尝试根据
/[a-z]+/i
regex匹配字符串,如果存在匹配项,将输出组0,即整个匹配项。请注意,如果没有找到匹配项,则[…]
之后的?
将使其正常失败。如果只使用put“?!!”[/[a-z]+/i]
,将引发异常
看
如果您想要类似于String#scan
的功能,返回输入中找到的所有匹配项,您可以使用(仅根据以下内容保留缩短版本):
报告的产出:
请注意:
- 将为每个匹配返回一个数组
- 您可以调用匹配来返回实际匹配的文本
#
,它也没有“全局”标志——正如其他人所提到的那样
如果只需要一个匹配,而不需要经过Regex::MatchData
,则可以使用:
似乎您想要
匹配项.string
,但是使用,您将获得所有匹配项。或者更简单的是,匹配项=str.scan(re).map(&.string)
@Amadan是的,当然,我也要添加它,但是睡着了:(就像凌晨2:30:)如果我只想将第一个匹配项转换为字符串,该怎么办put match.string
将打印Happy days
,而我只想打印Happy
。同时,put match
yieldsRegex::MatchData(“Happy”)
@Shadow43375我在答案顶部添加了两个变体。
puts "Happy days"[/[a-z]+/i]?
puts "Happy days".match(/[a-z]+/i).try &.[0]
matches = str.scan(re).map(&.string)
["Happy days", "Happy days"]
str = "Happy days"
p str[/[a-z]+/i] # => "Happy"