使用正则表达式中的可选块进行组编号

Str*_*kop 8 java regex

有没有办法让括号中的表达式被捕获?

我有一个像这样的表达式:

(A(B|C)?) D (E(F|G)?)
Run Code Online (Sandbox Code Playgroud)

记下可选块(B|C)?(F|G)?需要括号.
我对这些小组中的内容并不感兴趣.我想要的只是抓住完整的第一个和最后一个块.

但是由于可选块,组编号将改变,我无法判断是否(E(F|G)?)被捕获为组2或3.

我可以告诉表达式忽略结果组中的可选部分,因此组编号将保持不变吗?或者我可以使可选的捕获总是出现在组中 - 即使它们是空的?

fin*_*nnw 15

(E(F|G)?) 将始终作为组3捕获.编号由模式字符串中的左括号开始的顺序决定,即:

(A(B|C)?) D (E(F|G)?)
^ ^         ^ ^
1 2         3 4
Run Code Online (Sandbox Code Playgroud)

如果(B|C)输入字符串中没有出现,则group(2)返回null,但后续的组不会重新编号.

唯一不影响编号的组是非捕获组,例如

(A(?:B|C)?) D (E(?:F|G)?)
^             ^
1             2
Run Code Online (Sandbox Code Playgroud)

例:

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));
}
Run Code Online (Sandbox Code Playgroud)

输出:

A
null
EG
G
Run Code Online (Sandbox Code Playgroud)


Gum*_*mbo 9

有非捕获组(?:…):

(A(?:B|C)?) D (E(?:F|G)?)
Run Code Online (Sandbox Code Playgroud)

无法引用此类组的匹配.