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

2024-02-24

使用红宝石 2.2

我有如下字符串:

  • 每周二和周五
  • 每周一、周三和周六
  • 每月每两周的星期一

为了从上面显示的字符串中提取星期几,我编写了以下正则表达式:

/\b(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)\b/

当尝试使用时String#match实例方法 match_data 不返回所有匹配项。例如请参考下面所示的 irb 输出,其中当字符串Weekly on Tuesday and Friday与上面显示的正则表达式匹配MatchData仅包含Tuesday。我期望它包含Friday too.

  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 只包含第一个匹配的术语?我确信我的正则表达式遗漏了一些东西,但我无法弄清楚。

Note

Rubular 显示了相同正则表达式的正确匹配组,如下所示http://rubular.com/r/XZmrHPkjEk http://rubular.com/r/XZmrHPkjEk


看起来MatchData由返回.match() http://ruby-doc.org/core-2.2.1/String.html#method-i-match方法仅返回所有捕获组的第一个匹配项(如果有)。我刚刚测试过,只能获得 1 场比赛.match().

See 正则表达式.info http://To%20test%20if%20a%20particular%20regex%20matches%20(part%20of)%20a%20string,%20you%20can%20either%20use%20the%20=~%20operator,%20call%20the%20regexp%20object's%20match()%20method,%20e.g.:%20print%20%22success%22%20if%20subject%20=~%20/regex/%20or%20print%20%22success%22%20if%20/regex/.match(subject).细节:

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

另外,从here http://www.ralfebert.de/archive/ruby/regex_cheat_sheet/:

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

要获取所有匹配项,您需要使用.scan() http://ruby-doc.com/docs/ProgrammingRuby/html/ref_c_string.html#String.scan method.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐