В 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?
Обратите внимание, что вам не нужно использовать нежирный квантификатор для соответствия ';' в конце, используя жадный квантификатор '(. *)' Делает то же самое с меньшим количеством работы для механизма регулярных выражений. –