【问题标题】:Ruby str.match(regex) returns MatchData containing only first matched itemRuby str.match(regex) 返回仅包含第一个匹配项的 MatchData
【发布时间】:2015-06-22 01:58:33
【问题描述】:

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

【问题讨论】:

  • 您尝试过使用str.scan(/\b(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)\b/) 吗?是你要找的吗? ruby-doc.com/docs/ProgrammingRuby/html/….
  • @stribizhev 是 str.scan(regex) 返回所需的结果。但我需要了解为什么 str.match(regex) 没有返回所有匹配项。
  • 因为不应该这样? Regexp#match 只返回正则表达式的匹配项。您的正则表达式只查找一周中的某一天,并因此匹配。
  • @ChrisHeald 在这种情况下,您能否在我的正则表达式中提出修复建议,以便它反复匹配字符串中存在的星期几。我尝试在我的正则表达式中使用重复量词,但似乎我在将它们与单词边界一起使用时犯了一些错误。
  • 您无法从 Regexp#match 中获得任意数量的匹配组结果。您可以获得匹配多天的整个子字符串,但不能获取这些天的单个捕获。您需要为此使用#scan。

标签: regex ruby-2.2


【解决方案1】:

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

详见Regular-Expressions.info

要测试特定的正则表达式是否匹配 (part of) 字符串,您可以 要么使用 =~ 运算符,要么调用正则表达式对象的 match() 方法, 例如:如果主题 =~ /regex/ 则打印“成功”,如果 /regex/.match(主题)。

另外,来自here

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多