正则表达式中的可选块分组编号

8

有没有办法让括号中的表达式被捕获到一个组中呢?

例如,我有一个类似于这样的表达式:

(A(B|C)?) D (E(F|G)?)

请注意可选的块(B|C)?(F|G)?需要括号。
我不关心这些组中捕获了什么。我只想捕获第一个和最后一个完整块。
但由于这些可选块,组编号将会改变,我无法确定(E(F|G)?)是否作为第2或第3个组被捕获。
我能否告诉表达式忽略结果组中的可选部分,使组编号保持不变?或者我能否使可选捕获始终出现在组中-即使它们为null?
2个回答

15

(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

你是对的。 显然我被我的Eclipse插件QuickREx误导了,它只显示了3个组(但是索引为1、3和4)。但是非捕获位仍然非常有用,可以减少噪音。 - Stroboskop

9

有非捕获组(?:…)

(A(?:B|C)?) D (E(?:F|G)?)

这个组的匹配无法被引用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接