这两个术语是什么?
当前回答
贪婪匹配。正则表达式的默认行为是贪婪的。这意味着它会尝试提取尽可能多的数据,直到它符合某个模式,即使在语法上只需要较小的部分就足够了。
例子:
import re
text = "<body>Regex Greedy Matching Example </body>"
re.findall('<.*>', text)
#> ['<body>Regex Greedy Matching Example </body>']
它提取了整个字符串,而不是直到' > '第一次出现才匹配。这是regex默认的贪婪或“全部拿走”行为。
另一方面,懒惰匹配“需要的越少越好”。这可以通过添加一个?在图案的最后。
例子:
re.findall('<.*?>', text)
#> ['<body>', '</body>']
如果只希望检索第一个匹配项,则使用search方法。
re.search('<.*?>', text).group()
#> '<body>'
来源:Python Regex Examples
其他回答
试着理解以下行为:
var input = "0014.2";
Regex r1 = new Regex("\\d+.{0,1}\\d+");
Regex r2 = new Regex("\\d*.{0,1}\\d*");
Console.WriteLine(r1.Match(input).Value); // "0014.2"
Console.WriteLine(r2.Match(input).Value); // "0014.2"
input = " 0014.2";
Console.WriteLine(r1.Match(input).Value); // "0014.2"
Console.WriteLine(r2.Match(input).Value); // " 0014"
input = " 0014.2";
Console.WriteLine(r1.Match(input).Value); // "0014.2"
Console.WriteLine(r2.Match(input).Value); // ""
贪婪量词就像美国国税局
他们会尽量多拿。例如,匹配这个正则表达式:.*
The $50000
再见了,银行余额。
这里有一个例子:贪婪的例子
非贪婪量词——他们拿走的越少越好
要求退税:国税局突然变得不贪心了,退税越少越好:也就是说,他们用了这个量词:
(.{2,5}?)([0-9]*)与此输入:$50,000
第一组是不需要的,只匹配5美元-所以我从5万美元的输入中得到5美元的退款。
看这里:非贪婪的例子。
为什么我们需要贪婪和非贪婪?
如果你试图匹配一个表达式的某些部分,这就变得很重要。有时候你不想把所有的东西都搭配起来——越少越好。有时候你想要尽可能的匹配。仅此而已。
你可以使用上面链接中的例子。
(用来帮助你记忆的比喻)。
贪婪的人会尽可能多地消费。在http://www.regular-expressions.info/repeat.html中,我们看到了试图将HTML标记与<.+>匹配的示例。假设你有以下情况:
<em>Hello World</em>
你可能认为…+ >(。表示任何非换行符,+表示一个或多个)将只匹配<em>和</em>,而实际上它将非常贪婪,并从第一个<到最后一个>。这意味着它将匹配<em>Hello World</em>,而不是你想要的。
将其设置为惰性(<.+?>)将防止这种情况。通过添加?在+之后,我们告诉它重复尽可能少的次数,所以它遇到的第一个>就是我们想要停止匹配的地方。
我鼓励你下载RegExr,这是一个很好的工具,可以帮助你探索正则表达式——我一直在用它。
'Greedy'表示匹配最长的字符串。
'Lazy'表示匹配最短的字符串。
例如,贪婪的h.+l匹配'hello'中的'hell',但懒惰的h.+?L和“hel”匹配。
Greedy quantifier | Lazy quantifier | Description |
---|---|---|
* |
*? |
Star Quantifier: 0 or more |
+ |
+? |
Plus Quantifier: 1 or more |
? |
?? |
Optional Quantifier: 0 or 1 |
{n} |
{n}? |
Quantifier: exactly n |
{n,} |
{n,}? |
Quantifier: n or more |
{n,m} |
{n,m}? |
Quantifier: between n and m |
加一个?给量词,使其不贪婪,即懒惰。
例子: 测试字符串:stackoverflow 贪心reg表达式:s.*o输出:stackoverflow Lazy reg表达式:s.*?O输出:stackoverflow