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