找到所有匹配的子串,而不仅仅是"最扩展的"子串

sp0*_*00m 14 java regex substring

代码

String s = "y z a a a b c c z";
Pattern p = Pattern.compile("(a )+(b )+(c *)c");
Matcher m = p.matcher(s);
while (m.find()) {
    System.out.println(m.group());
}
Run Code Online (Sandbox Code Playgroud)

版画

a a a b c c
Run Code Online (Sandbox Code Playgroud)

哪个是对的.

但逻辑上,子串

a a a b c
a a b c c
a a b c
a b c c
a b c
Run Code Online (Sandbox Code Playgroud)

也匹配正则表达式.

那么,我怎样才能让代码找到那些子串呢,即不仅是最扩展的子串,还有它的子代码

Mic*_*ski 7

您可以使用不情愿的限定符,例如*?+?.这些比赛尽可能少,而相比之下,标准*+它们是贪婪的,即比赛尽可能.尽管如此,这只允许您找到特定的"子匹配",而不是全部.使用前瞻控制非捕获组可以实现更多控制,也在文档中描述.但是为了真正找到所有子匹配,你可能必须自己做一些事情,即构建正则表达式对应的自动机并使用自定义代码进行导航.