查找所有匹配的子字符串,而不仅仅是“最扩展”的子字符串

2022-09-04 22:37:03

代码

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());
}

指纹

a a a b c c

这是对的。

但从逻辑上讲,子字符串

a a a b c
a a b c c
a a b c
a b c c
a b c

也匹配正则表达式。

那么,我如何使代码也找到这些子字符串,即不仅是最扩展的子字符串,而且还有它的子字符串


答案 1

您可以使用不情愿的限定符,如 和 。与标准相反,这些匹配尽可能少,并且贪婪,即尽可能多地匹配。不过,这只允许您找到特定的“子匹配项”,而不是全部。使用前瞻控制非捕获组可以实现更多的控制,文档也对此进行了描述。但是为了真正找到所有子匹配项,您可能必须自己做一些事情,即构建正则表达式对应的自动机,并使用自定义代码对其进行导航。*?+?*+


答案 2

您将需要一个懒惰的量词

请尝试以下操作:

Pattern p = Pattern.compile("(a )+(b )+((c )*?)c");

另请注意,我再次将“”分组,因为我认为这是你想要的。否则,您将找到任意多个空格,但找不到“”。cc