Регулярное выражение никогда не совпадает

#java #regex

#java #регулярное выражение

Вопрос:

В моих файлах журнала есть следующие записи:

 09-22-11 12:35:09 1ms   INFO         ...erChangeSetListener:91           11  processing changeSet for class:4328,at version:1316720109100
09-22-11 12:35:09 779ms INFO         ...erChangeSetListener:91           11  processing changeSet for class:4334,at version:1316720109882
09-22-11 12:35:09 1ms   INFO         ...erChangeSetListener:91           11  processing changeSet for class:4328,at version:1316720109882
09-22-11 12:35:11 1s    WARNING      QueryServiceImpl:100                -   no existing index for class:4328
09-22-11 12:35:11       SEVERE       QueryRequest:107                    7   Aod query resulted in error:No index available for class:4328
09-22-11 12:35:11       SEVERE       AuthenticationTask:48               -   EndUserException: an error occurred when processing the query                                  Dump: /data1/amir/dev/devots/logs/dumps/22i123511.dump
  

к которому я применяю это регулярное выражение :

  final String pattern = "^(\d{2}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})"  //date
                          "[.]*" //ignore for now
                          "(SEVERE|WARNING|INFO|CONFIG|FINE|FINER|FINEST)" //severity
                          "[.]*"; //ignore the rest for now

 final Pattern regex = Pattern.compile(pattern);
 final Matcher m = regex.matcher(currentLine);
 if (m.matches()) {
     for (int i = 1; i <= m.groupCount(); i  ) {
         System.out.format("[%d] "%s"%n", i, m.group(i));
     }
 }
  

Но мои совпадения никогда не возвращают true. Я не понимаю, почему. Я бы хотел устойчиво обрабатывать эти разные типы записей. Обратите внимание, что с последней записью журнала связан файл дампа.

Комментарии:

1. Помимо конкретного вопроса, ваши журналы, похоже, имеют формат фиксированного столбца. Почему бы вам просто не создать подстроку по индексу?

Ответ №1:

Проблема здесь:

                       "[.]*" //ignore for now
  

Точка в "[.]*" соответствует только буквальной точке, она не имеет обычного значения «любой символ, не разделяющий строки». Вам нужно ".*"

Ответ №2:

Вы не можете сделать [.]* . .* будет достаточно. Вам нужен любой символ, а не точка.

Проверьте свое регулярное выражение здесь: http://regexpal.com /

Начните с очень простого соответствия и начните постепенно усложнять.

Кроме того, для ясности рассмотрите возможность присвоения имен вашим группам следующим образом:

 ^(?<date>d{2}-d{2}-d{2} d{2}:d{2}:d{2}).*(?<type>SEVERE|WARNING|INFO|CONFIG|FINE|FINER|FINEST).*
  

Комментарии:

1. Спасибо за рекомендацию regexpal.com , очень удобно визуализировать материал в режиме реального времени.