【问题标题】:Why does match find only 1 group in this ruby regexp?为什么匹配在这个 ruby​​ 正则表达式中只找到 1 个组?
【发布时间】:2016-04-06 13:35:58
【问题描述】:

我有这个字符串:

str = "\r\n <span>60 %</span>\r\n <br>\r\n40 %"

我想提取 2 个百分比,所以我写了这个:

str.match(/(\d{1,2}\s%)/)

但它只返回第一个,不明白为什么:

=&gt; #&lt;MatchData "60 %" 1:"60 %"&gt;

如果我在 rubular 中尝试这个,它会起作用。

rubular version

【问题讨论】:

标签: ruby regex


【解决方案1】:

使用scan 代替match,后者只会找到第一个匹配项。

str.scan(/(\d{1,2}\s%)/)

将产生匹配数组

["60 %", "40 %"]

【讨论】:

  • 这没有回答问题。
  • @sawa 是对的。您需要添加一个句子(或一个子句..match, which only...),并且请把句子的第一个单词大写。
  • ciabon,如果您要在计算中使用百分比,str.scan(/\d+(?=\s+%)/).map(&amp;:to_i) #=&gt; [60,40] 可能会更好。 (?=\s+%) 是一个正向预测。它必须有一个匹配,但它不被视为返回匹配的一部分。事实上,如果没有其他数字,str.scan(/\d+/).map(&amp;:to_i) #=&gt; [60,40] 就足够了。
【解决方案2】:

这是设计使然。 match 找到第一个匹配项。

【讨论】:

  • 这无助于实现预期结果:And I want to extract the 2 percentage
  • @NicNilov 这不是问题所在。不要作弊。不要改变被问到的内容。你不是 OP。
  • @Nic,您可以对问题发表评论或提出修改建议,但您无权更改标题以反映您认为 OP 在他/她的脑海中的想法。此外,有充分的理由,在给出答案后更改问题是违反规则的。据我们所知,OP 可能很清楚scan,只是对match 感到困惑。回答问题很重要。除此之外的任何东西都是肉汁。
  • @CarySwoveland 感谢您的解释,我很感激。
  • @Nic,您的回复 +1。通常,那些在 SO 上的智慧受到挑战的人会捍卫自己的立场,直到最后一滴血,或者一气呵成地走开,这肯定是心胸狭窄的迹象。
猜你喜欢
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-25
  • 2013-04-19
相关资源
最近更新 更多