在Ruby中,贪婪和非贪婪正则表达式有何区别?

4

有谁能帮我理解两种正则表达式的不同之处,并提供适当的示例呢?

  • 贪婪匹配
  • 非贪婪匹配

谢谢


1
你在哪里查找过?这个问题已经被所有正则表达式文档所覆盖。 - the Tin Man
3个回答

10
在贪婪算法中,正则表达式模式倾向于在源字符串中尽可能消耗最多的字符。例如:
textstr = "bcabdcab"
textstr.gsub!(/(.*)ab/, "xxx")  
# this will match whole `bcabdcab` and return `xxx`

这里的 * 是一个贪婪量词。非贪婪方式下,正则引擎在满足匹配条件时返回结果。要使量词变为非贪婪,只需在其后加上 ?

textstr = "bcabdcab"
textstr.gsub!(/(.*?)ab/, "xxx")  
# this will match only `bcab` part and return `xxxdcab`

gsub 函数返回将第一个参数中所有匹配模式替换为第二个参数后的字符串副本。


如果gsub函数是为了替换所有出现的模式,则第二个应该返回'xxxxxx'。 - Haven

3
请查看http://www.regular-expressions.info/repeat.html
贪心指的是正则表达式引擎尝试匹配某个字符集的次数。表达正则表达式“贪心性”的方式是使用特殊字符*+?{}
请考虑以下内容:
str = "asdfasdfbbbb"
r1 = /b/
r2 = /(asdf)*/
r3 = /b{3}/
r4 = /.*/

匹配这些正则表达式到 str 上会得到以下结果: r1 匹配 "asdfasdf b bbb" (非贪婪,只尝试匹配 b 一次)
r2 匹配 "asdfasdf bbbb" (贪婪,尝试尽可能多地匹配 asdf)
r3 匹配 "asdfasdf bbb b" (非贪婪,恰好匹配 b 三次)
r4 匹配 "asdfasdfbbbb" (超级贪婪,尝试尽可能多地匹配任何字符)
正则表达式是表示特定文本模式的方法,所以贪婪性并不是一个问题。有时需要匹配三次 foo(/(foo){3}/) 或无限次 bar(/(bar)*/)。

2
  • * - (0或更多)贪婪匹配
  • + - (1或更多)贪婪匹配
  • *? - (0或更多)非贪婪匹配
  • +? - (1或更多)非贪婪匹配

有没有特定的情况需要选择“贪婪”或“非贪婪”方法? - DoLoveSky
有关Ruby正则表达式的更多信息,请参见http://ruby.bastardsbook.com/chapters/regexes/ - Rachel Gallen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接