(E(F|G)?)
всегда будет определяться как группа 3. Нумерация определяется порядком открывающих скобок в строке шаблона, который составляет:
(A(B|C)?) D (E(F|G)?)
^ ^ ^ ^
1 2 3 4
Если (B|C)
не присутствует во входной строке, то group(2)
вернет ноль, но последующие группы не будут перенумерованы.
Единственные группы, которые не влияют на нумерацию, - это группы без захвата, например,
(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