Ruby str.match(regex)返回仅包含第一个匹配项的MatchData

时间:2015-04-15 21:49:20

标签: regex ruby-2.2

使用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

相同的正则表达式的正确匹配组

1 个答案:

答案 0 :(得分:3)

.match()方法返回的MatchData似乎只返回所有捕获组的第一个匹配项(如果有)。我刚测试了它,我只能得到.match()的一场比赛。

请参阅Regular-Expressions.info详细信息:

  

要测试特定正则表达式是否匹配(部分)字符串,您可以   使用=〜运算符,调用regexp对象的match()方法,   例如:print&#34; success&#34;如果主题=〜/正则表达式/或打印&#34;成功&#34;如果   /regex/.match(subject)。

此外,来自here

  

String.=~(Regexp)返回第一场比赛的起始位置或   如果没有找到匹配则为零

要获得所有匹配项,您需要使用.scan()方法。