这两个术语是什么?
当前回答
贪婪意味着它将消耗你的模式,直到没有剩下的,它不能再看了。
Lazy会在遇到您请求的第一个模式时立即停止。
我经常遇到的一个常见的例子是\s*-\s*?([0-9]{2}\s*-\s*?[0-9]{7})
第一个\s*被归类为贪婪的,因为有*,它会在遇到数字后寻找尽可能多的空白,然后寻找破折号“-”。第二个s*在哪里?懒惰是因为*的存在吗?这意味着它将查看第一个空白字符并在那里停止。
其他回答
来自正则表达式
regular中的标准量词 表达式是贪婪的,这意味着它们 尽可能多地匹配,只给予 回视需要进行匹配 正则表达式的剩余部分。 通过使用惰性量词,的 表达式尝试最小匹配 第一。
摘自www.regular-expressions.info
贪心:贪心量词首先尝试重复标记尽可能多的次数 尽可能,并逐渐放弃匹配,因为引擎返回寻找 一场全面的比赛。
惰性:惰性量词首先根据需要重复标记的次数,然后 随着引擎通过正则表达式返回到,逐渐扩展匹配 找到一个整体匹配。
贪婪量词就像美国国税局
他们会尽量多拿。例如,匹配这个正则表达式:.*
The $50000
再见了,银行余额。
这里有一个例子:贪婪的例子
非贪婪量词——他们拿走的越少越好
要求退税:国税局突然变得不贪心了,退税越少越好:也就是说,他们用了这个量词:
(.{2,5}?)([0-9]*)与此输入:$50,000
第一组是不需要的,只匹配5美元-所以我从5万美元的输入中得到5美元的退款。
看这里:非贪婪的例子。
为什么我们需要贪婪和非贪婪?
如果你试图匹配一个表达式的某些部分,这就变得很重要。有时候你不想把所有的东西都搭配起来——越少越好。有时候你想要尽可能的匹配。仅此而已。
你可以使用上面链接中的例子。
(用来帮助你记忆的比喻)。
贪婪意味着它将消耗你的模式,直到没有剩下的,它不能再看了。
Lazy会在遇到您请求的第一个模式时立即停止。
我经常遇到的一个常见的例子是\s*-\s*?([0-9]{2}\s*-\s*?[0-9]{7})
第一个\s*被归类为贪婪的,因为有*,它会在遇到数字后寻找尽可能多的空白,然后寻找破折号“-”。第二个s*在哪里?懒惰是因为*的存在吗?这意味着它将查看第一个空白字符并在那里停止。
贪婪的人会尽可能多地消费。在http://www.regular-expressions.info/repeat.html中,我们看到了试图将HTML标记与<.+>匹配的示例。假设你有以下情况:
<em>Hello World</em>
你可能认为…+ >(。表示任何非换行符,+表示一个或多个)将只匹配<em>和</em>,而实际上它将非常贪婪,并从第一个<到最后一个>。这意味着它将匹配<em>Hello World</em>,而不是你想要的。
将其设置为惰性(<.+?>)将防止这种情况。通过添加?在+之后,我们告诉它重复尽可能少的次数,所以它遇到的第一个>就是我们想要停止匹配的地方。
我鼓励你下载RegExr,这是一个很好的工具,可以帮助你探索正则表达式——我一直在用它。
推荐文章
- 如何从JavaScript中使用正则表达式的字符串中剥离所有标点符号?
- 正则表达式中的单词边界是什么?
- 如何将一个标题转换为jQuery的URL段塞?
- Javascript和regex:分割字符串并保留分隔符
- (grep)正则表达式匹配非ascii字符?
- 如何在保持原始字符串的同时对字符串执行Perl替换?
- 创建正则表达式匹配数组
- *的区别是什么?和。*正则表达式?
- 如何将“camelCase”转换为“Camel Case”?
- 在Java中使用正则表达式提取值
- Java中的正则表达式命名组
- 使用正则表达式搜索和替换Visual Studio代码
- 使用split("|")按管道符号拆分Java字符串
- 替换字符串中第一次出现的模式
- “\d”在正则表达式中是数字吗?