Нумерация групп с необязательными блоками в регулярном выражении - PullRequest
8 голосов
/ 10 февраля 2010

Есть ли способ, чтобы выражение в скобках не попало в группу?

например. у меня есть выражение что-то вроде этого:

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

Обратите внимание на дополнительные блоки (B|C)? и (F|G)?, требующие скобок.
Мне не интересно, что было поймано в этих группах. Все, что я хочу, это поймать полный первый и последний блок.

Но из-за необязательных блоков нумерация групп изменится, и я не могу сказать, был ли (E(F|G)?) пойман как группа 2 или 3.

Могу ли я сказать выражению игнорировать необязательные части в результирующих группах, чтобы нумерация групп не изменилась? Или я могу сделать так, чтобы дополнительные уловки всегда появлялись в группах - даже если они нулевые?

Ответы [ 2 ]

15 голосов
/ 10 февраля 2010

(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
9 голосов
/ 10 февраля 2010

Есть группы без захвата (?:…):

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

На матч такой группы нельзя ссылаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...