2016-01-04 4 views
0

Я с чертовски времени получать это регулярное выражение для вывода группы я ожидаю:Java регулярное выражение захвата группы чисел

Pattern p = Pattern.compile("(point) (.*)"); 
Matcher m = p.matcher("point 0 0 255 0 0"); 

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

Я надеюсь увидеть этот выход:

point 0 0 255 0 0 // this is group 0 
point 
0 0 255 0 0 

Вместо этого я получаю группу 0 и 1 - ничего из последней группы.

Я не знаю, что я делаю неправильно.

В конечном счете, я пытаюсь сопоставить (point|rect|line) и переменное число целых чисел.

Спасибо ...

ответ

1

Вы не печатаете все группы. Попробуйте for (int i = 0; i <= m.groupCount(); i++)

0

Группа 0 всегда относится к первоначально подобранной строке - в вашем примере, point 0 0 255 0 0. Следовательно, нулевые группы захвата в вашем шаблоне ссылаются на индекс, основанный на 1 - в вашем примере группа 1, группа 2.

Это общий манере с другими языками программирования. JavaScript и Perl также обозначают нулевое соответствие индекса (также называемое \0 в функциях «replace») как целая строка.

Поэтому для вывода ваших ожидаемых групп захвата, вы должны цикла от 0 до 2 или от 1 до 2:

for (int i = 0; i <= m.groupCount(); i++) { 
    //    ^-- changed "<" to "<=" 
    System.out.println("-- " + m.group(i)); 
} 

Output: 
point 0 0 255 0 0 
point 
0 0 255 0 0 
Смежные вопросы