Sam*_*son 592
贪婪会尽可能多地消耗掉.从http://www.regular-expressions.info/repeat.html我们看到尝试匹配HTML标签的示例<.+>
.假设您有以下内容:
<em>Hello World</em>
Run Code Online (Sandbox Code Playgroud)
您可能认为<.+>
(.
意味着任何非换行符并且+
意味着一个或多个)只会匹配<em>
和</em>
,而实际上它将非常贪婪,并从第一个<
到最后一个>
.这意味着它将匹配<em>Hello World</em>
而不是您想要的.
使它懒惰(<.+?>
)将防止这种情况.通过添加?
之后+
,我们告诉它重复尽可能少的次数,所以>
它遇到的第一个,就是我们想要停止匹配的地方.
我鼓励你下载RegExr,这是一个很棒的工具,可以帮助你探索正则表达式 - 我一直都在使用它.
sle*_*man 280
'贪婪'意味着匹配最长的字符串.
'懒惰'意味着匹配最短的字符串.
例如,贪婪的h.+l
比赛'hell'
中'hello'
,但懒惰的h.+?l
比赛'hel'
.
Pre*_*raj 101
+-------------------+-----------------+------------------------------+
| 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 |
+-------------------+-----------------+------------------------------+
Run Code Online (Sandbox Code Playgroud)
加一个?一个量词使它不合适,即懒惰.
实施例:
测试字符串:计算器
贪婪reg表达式:s.*o
输出:stackoverflo瓦特
懒惰reg表达式:s.*?o
输出:stacko verflow
Car*_*rum 54
贪婪意味着你的表达式将尽可能地匹配一个组,懒惰意味着它将匹配可能的最小组.对于这个字符串:
abcdefghijklmc
Run Code Online (Sandbox Code Playgroud)
这个表达式:
a.*c
Run Code Online (Sandbox Code Playgroud)
贪婪的匹配将匹配整个字符串,而惰性匹配将匹配第一个abc
.
Eug*_*ene 14
据我所知,大多数正则表达式引擎默认是贪心的.在量词的末尾添加问号将启用延迟匹配.
正如@Andre S在评论中提到的那样.
请参阅下面的示例,了解贪婪和懒惰的内容.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String args[]){
String money = "100000000999";
String greedyRegex = "100(0*)";
Pattern pattern = Pattern.compile(greedyRegex);
Matcher matcher = pattern.matcher(money);
while(matcher.find()){
System.out.println("I'm greeedy and I want " + matcher.group() + " dollars. This is the most I can get.");
}
String lazyRegex = "100(0*?)";
pattern = Pattern.compile(lazyRegex);
matcher = pattern.matcher(money);
while(matcher.find()){
System.out.println("I'm too lazy to get so much money, only " + matcher.group() + " dollars is enough for me");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我很开心,我想要1亿美元.这是我能得到的最多.
我懒得拿那么多钱,只有100美元对我来说已经足够了
Sel*_*lva 10
贪心匹配。正则表达式的默认行为是贪婪的。这意味着它会尝试尽可能多地提取,直到它符合模式,即使较小的部分在语法上就足够了。
\n\n例子:
\n\nimport re\ntext = "<body>Regex Greedy Matching Example </body>"\nre.findall(\'<.*>\', text)\n#> [\'<body>Regex Greedy Matching Example </body>\']\n
Run Code Online (Sandbox Code Playgroud)\n\n它不是匹配到第一次出现 \xe2\x80\x98>\xe2\x80\x99,而是提取整个字符串。这是正则表达式的默认贪婪或 \xe2\x80\x98take it all\xe2\x80\x99 行为。
\n\n另一方面,惰性匹配\xe2\x80\x98 需要尽可能少的\xe2\x80\x99。?
这可以通过在模式末尾添加 来实现。
例子:
\n\nre.findall(\'<.*?>\', text)\n#> [\'<body>\', \'</body>\']\n
Run Code Online (Sandbox Code Playgroud)\n\n如果您只想检索第一个匹配项,请改用搜索方法。
\n\nre.search(\'<.*?>\', text).group()\n#> \'<body>\'\n
Run Code Online (Sandbox Code Playgroud)\n\n\n
摘自www.regular-expressions.info
贪婪:贪婪的量词首先尝试尽可能多地重复令牌,并逐渐放弃匹配,因为引擎回溯以找到整体匹配.
懒惰:懒惰量词首先根据需要重复令牌次数,并逐渐扩展匹配,因为引擎通过正则表达式回溯以找到整体匹配.
他们\xe2\x80\x99会尽可能多地拿走。例如与此正则表达式匹配:.*
$50,000
再见银行余额。
\n请参阅此处的示例:贪婪示例
\n要求退税:国税局突然变得不贪婪 - 并尽可能少地退税:即他们使用这个量词:
\n(.{2,5}?)([0-9]*)
针对此输入:$50,000
第一组是非需求组,仅匹配$5
\xe2\x80\x93,因此我获得了$5
50,000 美元输入的退款。
请参阅此处:非贪婪示例。
\n如果您尝试匹配表达式的某些部分,这一点就变得很重要。有时您不想匹配所有内容 - 尽可能少。有时您希望尽可能匹配。仅此而已。
\n您可以尝试上面发布的链接中的示例。
\n(用于帮助您记住的类比)。
\n小智 6
最好通过例子来展示。细绳。192.168.1.1
和贪婪的正则表达式\b.+\b
您可能认为这会给您第一个八位字节,但实际上与整个字符串匹配。为什么?因为.+是贪婪的,贪婪匹配会匹配其中的每个字符192.168.1.1
,直到到达字符串末尾。这是重要的一点!现在它开始一次回溯一个字符,直到找到第三个标记 ( \b
) 的匹配项。
如果字符串 4GB 文本文件和 192.168.1.1 位于开头,您可以很容易地看到这种回溯将如何导致问题。
要使正则表达式非贪婪(惰性),请在贪婪搜索后添加问号,例如
*?
??
+?
Run Code Online (Sandbox Code Playgroud)
现在发生的情况是标记 2 ( +?
) 找到匹配项,正则表达式沿着字符移动,然后尝试下一个标记 ( \b
) 而不是标记 2 ( +?
)。所以它小心翼翼地爬行。
贪婪意味着它会消耗你的模式,直到没有任何模式剩下,并且它无法再继续寻找。
Lazy 一旦遇到您请求的第一个模式就会停止。
我经常遇到的一个常见示例是\s*-\s*?
正则表达式([0-9]{2}\s*-\s*?[0-9]{7})
第一个\s*
被归类为贪婪,因为*
它会在遇到数字后查找尽可能多的空格,然后查找破折号字符“-”。第二个\s*?
是懒惰的,因为它的存在*?
意味着它将查找第一个空白字符并停在那里。
归档时间: |
|
查看次数: |
222068 次 |
最近记录: |