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

1

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

Мой код:

   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");

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

Зачем?

Теги:
parentheses
capturing-group

1 ответ

3

Из javadocs группы 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.

  • 0
    Спасибо за ответ !

Ещё вопросы

Сообщество Overcoder
Наверх
Меню