我对在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)"
请注意,该初始字符串可能包含也可能不包含“()”中的任意数量的组。
答案 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]
..负向前瞻必须在第一次重复之前(这里懒惰=非贪婪)