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作为匹配项。

最佳答案

代码中唯一的错误是您没有遍历所有找到的Matcher子序列。

while (mtch.find()) { // <-- not if here
    System.out.println(mtch.group());
}


模式"a*"在匹配您的字符串中的"aa"之前将匹配两个空字符串,这是预期的,因为*量词允许出现零次。但是,+量词将不匹配空字符串,因为它匹配一个或多个出现(tutorial about quantifiers)。

 b b a a c
^ ^  ^  ^ ^   <-- matches for case of *

08-19 04:01