4

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

4

1 回答 1

4

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

请参阅正则表达式.info详细信息:

要测试特定的正则表达式是否匹配(部分)字符串,您可以使用 =~ 运算符,调用正则表达式对象的 match() 方法,例如: print "success" if subject =~ /regex/ 或 print "success"如果 /regex/.match(主题)。

另外,从这里

String.=~(Regexp)返回第一个匹配项的起始位置,如果没有找到匹配项,则返回 nil

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

于 2015-04-15T22:33:39.107 回答