2014-11-21 3 views
1

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

Мой код был:

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

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

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

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

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

Почему?

ответ

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

Спасибо за ответ! – user2985024

Смежные вопросы