使用Ruby 2.2
我有以下字符串:
要从上面显示的字符串中提取星期几,我写了以下正则表达式:
/\b(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)\b/
尝试使用String#match
实例方法时,match_data不会返回所有匹配项。对于例如请参考下面显示的irb输出,其中当字符串Weekly on Tuesday and Friday
与上面显示的正则表达式匹配时,MatchData
仅包含Tuesday
。我希望它也包含Friday
。
2.2.1 :001 > str = "Weekly on Tuesday and Friday"
=> "Weekly on Tuesday and Friday"
2.2.1 :002 > regex = /\b(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)\b/
=> /\b(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)\b/
2.2.1 :003 > str.match(regex)
=> #<MatchData "Tuesday" 1:"Tuesday">
2.2.1 :004 > match_data = str.match(regex)
=> #<MatchData "Tuesday" 1:"Tuesday">
2.2.1 :005 > match_data.captures
=> ["Tuesday"]
有人可以解释一下,为什么当我没有在我的正则表达式中使用任何开始/结束锚时,MatchData只包含第一个匹配的术语?我相信我的正则表达式错过了一些东西,但我无法弄明白。
注意
Rubular显示了与http://rubular.com/r/XZmrHPkjEk
相同的正则表达式的正确匹配组答案 0 :(得分:3)
.match()
方法返回的MatchData
似乎只返回所有捕获组的第一个匹配项(如果有)。我刚测试了它,我只能得到.match()
的一场比赛。
请参阅Regular-Expressions.info详细信息:
要测试特定正则表达式是否匹配(部分)字符串,您可以 使用=〜运算符,调用regexp对象的match()方法, 例如:print&#34; success&#34;如果主题=〜/正则表达式/或打印&#34;成功&#34;如果 /regex/.match(subject)。
此外,来自here:
String.=~(Regexp)
返回第一场比赛的起始位置或 如果没有找到匹配则为零
要获得所有匹配项,您需要使用.scan()
方法。