2015-10-07 4 views
1

В java, я пытаюсь проанализировать файл журнала с помощью регулярного выражения. Ниже одной строки файла журнала.Вторая группа захвата, не захватывающая

I 20151007 090137 - com.example.Main - Main.doStuff (293): ##identifier (id:21): {}; 

Мне нужна строка json в конце строки и идентификатор. Это означает, что мне нужны две группы захвата. Поэтому я начал кодировать.

Pattern p = Pattern.compile(
    "^I [0-9]{8} [0-9]{6} - com\\.example\\.Main - Main\\.doStuff \\(\\d+\\): ##identifier \\(id:(\\d+)\\): (.*?);$" 
); 

(.*?) в конце узора происходит потому, что она должна быть жадным, но дают обратно ; в самом конце строки ввода.

Matcher m = p.matcher(readAboveLogfileLineToString()); 
System.err.println(m.matches() + ", " + m.groupCount()); 
for (int i = 0; i < m.groupCount(); i++) { 
    System.out.println(m.group(i)); 
} 

Однако выше код выхода

true, 2 
I 20151007 090137 - com.example.Main - Main.doStuff (293): ##identifier (id:21): {}; 
21 

А где мой "отдых" группу? И почему вся группа - группа? Я проверил несколько тестовых сайтов регулярного выражения онлайн, и он должен работать: например, http://www.regexplanet.com/advanced/java/index.html видит 3 группы захвата. Может быть, это связано с тем, что я сейчас использую jdk 1.6?

+1

Обратите внимание, что вам не нужно использовать нежирный квантификатор для соответствия ';' в конце, используя жадный квантификатор '(. *)' Делает то же самое с меньшим количеством работы для механизма регулярных выражений. –

ответ

3

Проблема заключается в том, что итерация groupCount является одним из немногих случаев на Java, где вам действительно нужно достичь значения count, чтобы получить все группы.

В этом случае вам необходимо выполнить итерацию в группе 2, так как группа 0 фактически представляет весь матч.

Просто увеличивает свой счетчик как таковые (обратите внимание на <= вместо просто <):

for (int i = 0; i <= m.groupCount(); i++) { 

Последнего текст напечатан должна быть: {}

Вы также можете пропустить группу 0 приступайте свой счет на 1 напрямую, конечно.

Подводя итоги, явные группы, помеченные в скобках Pattern, начинаются с индекса 1.

См. Документацию here.

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

  • Нет связанных вопросов^_^