Регулярное выражение и захват скобок
Я пытаюсь понять, как работают скобки для регулярных выражений, но я не понимаю...
Мой код был:
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.