提问者:小点点

在正则表达式的上下文中,“lazy”和“greedy”是什么意思?


有人能以一种易懂的方式解释这两个术语吗?


共3个答案

匿名用户

贪婪就会尽可能多地消耗。 在http://www.regular-expressions.info/repeat.HTML中,我们看到了尝试将HTML标记与<.+>匹配的示例。 假设您有以下内容:

<em>Hello World</em>

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

使它变得懒惰(<.+?>)可以防止这种情况。 通过在+后面添加,我们告诉它要尽可能少地重复,因此它遇到的第一个>就是我们希望停止匹配的地方。

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

匿名用户

“贪婪”意味着匹配最长可能字符串。

'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
惰性reg表达式:S.*?o输出:stackoverflow