使用红宝石 2.2
我有如下字符串:
为了从上面显示的字符串中提取星期几,我编写了以下正则表达式:
/\b(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)\b/
Run Code Online (Sandbox Code Playgroud)
当尝试使用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"]
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下,当我在正则表达式中没有使用任何开始/结束锚点时,为什么 MatchData 只包含第一个匹配的术语?我确信我的正则表达式遗漏了一些东西,但我无法弄清楚。
笔记
似乎方法MatchData返回.match()仅返回所有捕获组(如果有)的第一个匹配项。我刚刚测试过,我只能得到 1 场比赛.match()。
请参阅正则表达式.info详细信息:
要测试特定正则表达式是否与字符串(部分)匹配,您可以使用 =~ 运算符,调用 regexp 对象的 match() 方法,例如: print "success" if subject =~ /regex/ 或 print "success" if /regex/.match(主题)。
另外,从这里开始:
String.=~(Regexp)返回第一个匹配的起始位置,如果没有找到匹配则返回 nil
要获取所有匹配项,您需要使用.scan()方法。