这两个术语是什么?


当前回答

贪婪的人会尽可能多地消费。在http://www.regular-expressions.info/repeat.html中,我们看到了试图将HTML标记与<.+>匹配的示例。假设你有以下情况:

<em>Hello World</em>

你可能认为…+ >(。表示任何非换行符,+表示一个或多个)将只匹配<em>和</em>,而实际上它将非常贪婪,并从第一个<到最后一个>。这意味着它将匹配<em>Hello World</em>,而不是你想要的。

将其设置为惰性(<.+?>)将防止这种情况。通过添加?在+之后,我们告诉它重复尽可能少的次数,所以它遇到的第一个>就是我们想要停止匹配的地方。

我鼓励你下载RegExr,这是一个很好的工具,可以帮助你探索正则表达式——我一直在用它。

其他回答

贪婪的人会尽可能多地消费。在http://www.regular-expressions.info/repeat.html中,我们看到了试图将HTML标记与<.+>匹配的示例。假设你有以下情况:

<em>Hello World</em>

你可能认为…+ >(。表示任何非换行符,+表示一个或多个)将只匹配<em>和</em>,而实际上它将非常贪婪,并从第一个<到最后一个>。这意味着它将匹配<em>Hello World</em>,而不是你想要的。

将其设置为惰性(<.+?>)将防止这种情况。通过添加?在+之后,我们告诉它重复尽可能少的次数,所以它遇到的第一个>就是我们想要停止匹配的地方。

我鼓励你下载RegExr,这是一个很好的工具,可以帮助你探索正则表达式——我一直在用它。

试着理解以下行为:

    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。

摘自www.regular-expressions.info

贪心:贪心量词首先尝试重复标记尽可能多的次数 尽可能,并逐渐放弃匹配,因为引擎返回寻找 一场全面的比赛。

惰性:惰性量词首先根据需要重复标记的次数,然后 随着引擎通过正则表达式返回到,逐渐扩展匹配 找到一个整体匹配。

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

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

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