如果您希望第一组和第三组包含括号前后的所有字符,则必须确保它们排除(
和)
(您.*
还将匹配包含括号的组,例如(foo)(bar)
在第二个示例中)。
所以我会.*
用这个替换[^\\(\\)]*
。
此外,如果要匹配包含第二组许多子字符串的字符串(如第二个示例中),则应该*
在第二组之后。
我的结果是这样的:
^([^\\(\\)]*)?(\\([a-z]*\\))*([^\\(\\)]*)?$
这将适用于第一个示例和第二个示例,但第二组最终将仅存储找到的最后一个 - (bz)
。
如果您希望能够像您在第二个示例中所说的那样捕获第二组 3 次,您可以尝试使用while m.find()
而不是if m.matches()
( m
is a Matcher
object); 并将您的正则表达式更改为:
([^\\(\\)]*)(\\([a-z]*\\))([^\\(\\)]*)
这应该是字符串中每个可能匹配的第二组 - (foo)
, (bar)
, (bz)
。
编辑:由于某种我无法真正解释的原因,对我来说它没有找到(foo)
,只有另外两个。所以我写了一段代码,尝试find()
使用一个参数,明确地从某个位置开始,最后找到的组结束:
String regex = "([^\\(\\)]*)(\\([a-z]*\\))([^\\(\\)]*)";
String text = "(foo)(bar)(bz)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(text);
for (int reg = 0; reg < text.length(); reg+=(m.end()-m.start()))
if (m.find(reg))
for (int group = 1; group <=m.groupCount(); group++)
System.out.println("Group "+group+": "+m.group(group));
这有效,输出为:
Group 1:
Group 2: (foo)
Group 3:
Group 1:
Group 2: (bar)
Group 3:
Group 1:
Group 2: (bz)
Group 3: