2016-12-16 2 views
1

via Я проверил мой регулярное выражениеСличитель не возвращает правильный номер группы

([\S]*)[\[]([\d]+)[-]([\d]+)[\]] 

, но когда я использую его в Java, она не возвращается ко мне, наконец, нашел группу.

Ex: значение - индекс [1-9]

через regex101 - он возвращает меня "Индекс", "1", "9"

но в Java - "Индекс" и " 1" только

Вот кусок кода я использую:

String regex = "([\\S]*)[\\[]([\\d]+)[-]([\\d]+)[\\]]"; 
Pattern pattern = Pattern.compile(regex); 
Matcher matcher = pattern.matcher(text); 
if(matcher.find()){ 
for (int i = 0; i < matcher.groupCount(); i++) 
     System.out.println(matcher.group(i)); 
} 

Есть подсказки, почему это происходит?

+0

Просьба показать, как вы определили регулярное выражение в Java-коде. –

+0

@ WiktorStribiżew ([\ S] *) [\ [] ([\ d] +) [-] ([\ d] +) ([\]]) – DreadAngel

ответ

4

При использовании matcher.group(int), номера группы захвата начинаются с 1, а не 0. Из the docs:

Захват группы индексируются слева направо, начиная с единицы. Ноль группы обозначает весь шаблон, поэтому выражение m.group(0) эквивалентно m.group().

+4

На самом деле существует 0-я группа, это целый совпадение. –

+0

@ WiktorStribiżew - Да. Спасибо что подметил это. Я просто добавлял в соответствующую выдержку из документов. Чтобы быть технически корректным, я пересмотрел свой ответ, чтобы сказать конкретно «номера групп захвата». –

+0

Сегодня я узнал что-то новое. Конечно, я не делаю много регулярных выражений на Java. Благодарю. – DejaVuSansMono

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