请解释*贪婪量词的工作原理

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上的空字符串 :

在此处输入图像描述