这两个术语是什么?


当前回答

来自正则表达式

regular中的标准量词 表达式是贪婪的,这意味着它们 尽可能多地匹配,只给予 回视需要进行匹配 正则表达式的剩余部分。 通过使用惰性量词,的 表达式尝试最小匹配 第一。

其他回答

试着理解以下行为:

    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); // ""

贪婪意味着你的表达式将匹配尽可能大的组,懒惰意味着它将匹配尽可能小的组。对于这个字符串:

abcdefghijklmc

这个表达式是:

a.*c

贪婪匹配将匹配整个字符串,而懒惰匹配将只匹配第一个abc。

贪婪匹配。正则表达式的默认行为是贪婪的。这意味着它会尝试提取尽可能多的数据,直到它符合某个模式,即使在语法上只需要较小的部分就足够了。

例子:

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

'Greedy'表示匹配最长的字符串。

'Lazy'表示匹配最短的字符串。

例如,贪婪的h.+l匹配'hello'中的'hell',但懒惰的h.+?L和“hel”匹配。

最好用例子来说明。字符串。192.168.1.1和一个贪婪的正则表达式\b.+\b 你可能认为这会给你第一个八位元,但实际上是匹配整个字符串。为什么?因为。+是贪婪的,贪婪匹配匹配192.168.1.1中的每个字符,直到它到达字符串的末尾。这是最重要的一点!现在它开始一次回溯一个字符,直到找到与第三个标记(\b)匹配的字符。

如果字符串一个4GB文本文件和192.168.1.1在开始,你可以很容易地看到这个回溯会导致一个问题。

要使正则表达式非贪婪(懒惰),在你的贪婪搜索后放一个问号

*?
??
+?

现在发生的事情是令牌2(+?)找到一个匹配,regex沿着一个字符移动,然后尝试下一个令牌(\b),而不是令牌2(+?)。所以它小心翼翼地爬行着。