请解释*贪婪量词的工作原理
Pattern ptn = Pattern.compile("a*"); Matcher mtch = ptn.matcher("bbaac"); if(mtch.find()){ System.out.println(mtch.group()); }
输出 – 什么都不打印
Pattern ptn = Pattern.compile("a+"); Matcher mtch = ptn.matcher("bbaac"); if(mtch.find()){ System.out.println(mtch.group()); }
输出 – aa
我知道这是一个非常简单的问题,但我仍然对看到*
和+
的行为感到困惑(两者都是贪婪的量词)。 请让我知道为什么在第一种情况下输出没有打印,即a*
贪婪它应该返回aa
作为匹配。
您的代码中唯一错误的是您没有遍历匹配的所有已发现的子序列。
while (mtch.find()) { // <-- not if here System.out.println(mtch.group()); }
在匹配字符串中的"aa"
之前,模式"a*"
将匹配两个空字符串,因为它是预期的,因为*
量词允许零次出现。 但是, +
量词与空字符串不匹配,因为它匹配一个或多个出现( 有关量词的教程 )。
bbaac ^ ^ ^ ^ ^ <-- matches for case of *
问题是有5个匹配,你只检查第一个是空字符串,因为a*
可以匹配一个空字符串(更准确地说,它匹配在它无法匹配的字符之前的空白空间和字符串的结尾)。
使用while
不是if
。
请参阅IDEONE演示 :
String s = "bbaac"; Pattern pattern = Pattern.compile("a*"); Matcher matcher = pattern.matcher(s); while (matcher.find()){ System.out.println(matcher.group(0)); }
比赛数量为5:
- 第一个
b
之前的空字符串 - 第二个
b
之前的空字符串 -
aa
-
c
和之前的空字符串 -
c
之后的空(结束)字符串。
使用a+
, +
quantier意味着出现1次或更多次 ,不会提取空匹配,只会获得aa
。
查看regex101.com上的空字符串 :