Ruby Regex仅捕获最后一个匹配组的值

时间:2013-11-15 00:50:45

标签: ruby regex

我对在Ruby中使用非贪婪的正则表达式感到困惑,因为匹配应该从字符串的末尾完成。

假设我的字符串:

s = "Some words (some nonsense) and more words (target group)"

我想在结果中得到“(目标群体)”。我怎样才能做到这一点?正在尝试以下方法:

贪婪:

s.match(/\(.*\)$/)[0]
=> "(some nonsense) and more words (target group)"

s.match(/\(.*\)/)[0]
=> "(some nonsense) and more words (target group)"

非贪婪:

s.match(/\(.*?\)/)[0]
=> "(some nonsense)"

s.match(/\(.*?\)$/)[0]
=> "(some nonsense) and more words (target group)"

请注意,该初始字符串可能包含也可能不包含“()”中的任意数量的组。

4 个答案:

答案 0 :(得分:4)

使用scan

的非贪婪正则表达式方法
s.scan(/\(.*?\)/).last
=>"(target group)"

答案 1 :(得分:2)

不确定我理解你的问题。如果我弄错了,我很抱歉:

.*?完成后,您确定需要[^)]*吗?

s.match(/\([^)]*\)$/)[0]
=> "(target group)"

如果您坚持使用.*?,请在不情愿的比赛之前进行贪婪的比赛:

s.match(/^.*(\(.*?\))$/)[1]
=> "(target group)"

答案 2 :(得分:1)

这是一个非正则表达式版本:

s = "Some words (some nonsense) and more words (target group)"

p s[(s.rindex('(')+1)...s.rindex(')')] #=> target group

答案 3 :(得分:0)

负面预设

s.match(/\([^)]*\)(?!.*\(.*\))/)[0]

..负向前瞻可以在捕获的表达式结束时

非贪婪(懒惰),具有负向前瞻

s.match(/\((?!.*\(.*\)).*?\)/)[0]

..负向前瞻必须在第一次重复之前(这里懒惰=非贪婪)