Регулярное выражение и захват скобок

Я пытаюсь понять, как работают скобки для регулярных выражений, но я не понимаю...

Мой код был:

   Pattern pattern = Pattern.compile("ab");
   Matcher m = pattern.matcher("abc");

  while (m.find()) { 
      for (int i = 0; i < m.groupCount(); i++) {
          System.out.println(m.group(i));
      }
  }

так что у меня вообще не было дисплея. Я понял, что мне нужно сделать круглые скобки, чтобы запомнить результат сопоставления и отобразить его.

Так я и сделал:

   Pattern pattern = Pattern.compile("(ab)");
   Matcher m = pattern.matcher("abc");

И у меня был ожидаемый дисплей: ab

Затем я хотел запомнить и отобразить только часть результата сопоставления, поэтому я сделал:

   Pattern pattern = Pattern.compile("(a)b");
   Matcher m = pattern.matcher("abc");

Я ожидал иметь: а, но я имел: ab

Зачем?

1 ответ

Из ага Matcher#group():

Группы захвата индексируются слева направо, начиная с единицы. Группа ноль обозначает весь шаблон, поэтому выражение m.group(0) эквивалентно m.group().

Проблема в том, что группа ноль (т.е. m.group(0)) соответствует всему шаблону, а не тому, который содержится в круглых скобках. Таким образом, чтобы соответствовать группе, которую вы хотите, вам нужно начать с индекса 1 и заканчивать до подсчета группы:

for (int i = 1; i <= m.groupCount(); i++) {
    System.out.println(m.group(i));
}

В вашем случае у вас есть только одна группа. Но если у вас есть что-то вроде Pattern.compile("(a)(b)"), затем (a) будет соответствовать группе 1 и (b) будет соответствовать группе 2.

Другие вопросы по тегам