有没有办法让括号中的表达式不被捕获到一个组中呢?
例如,我有一个类似于这样的表达式:
(A(B|C)?) D (E(F|G)?)
请注意可选的块
(B|C)?
和(F|G)?
需要括号。我不关心这些组中捕获了什么。我只想捕获第一个和最后一个完整块。
但由于这些可选块,组编号将会改变,我无法确定
(E(F|G)?)
是否作为第2或第3个组被捕获。我能否告诉表达式忽略结果组中的可选部分,使组编号保持不变?或者我能否使可选捕获始终出现在组中-即使它们为null?
(E(F|G)?)
始终会被捕获为第3组。编号是由模式字符串中开括号的顺序确定的,即:
(A(B|C)?) D (E(F|G)?)
^ ^ ^ ^
1 2 3 4
如果输入字符串中不包含 (B|C)
,则 group(2)
将返回 null,但是后续的群组不会被重新编号。
唯一不影响编号的组是非捕获组,例如。(A(?:B|C)?) D (E(?:F|G)?)
^ ^
1 2
例子:
Pattern pattern = Pattern.compile("(A(B|C)?) D (E(F|G)?)");
Matcher matcher = pattern.matcher("A D EG");
if (matcher.matches()) {
System.err.println(matcher.group(1));
System.err.println(matcher.group(2));
System.err.println(matcher.group(3));
System.err.println(matcher.group(4));
}
输出:
A
null
EG
G
有非捕获组(?:…)
:
(A(?:B|C)?) D (E(?:F|G)?)