Regex для журналов исключений - PullRequest
1 голос
/ 10 марта 2020

Я использую PCRE для сопоставления журналов исключений с помощью следующего регулярного выражения.

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

\[([\d -:]+)\]ERROR.*?(F:[^ ]+|F:).*?(?sx).*?(\b[a-zA-Z]*Exception\b)

Образец журналов исключений

  1. Где перехваченное исключение является встроенным (в одну строку) оператора журнала

    [2020-03-07 01:02:37.512]ERROR [L:xx F:yy T:zz R: C: ] xxxxxxx xxxxx xxxx xxxx NullPointerException
            at com.package.name(b.java:20)
            at com.package.name.someClass.someMethod(P.java:2423)
            at com.package.name.someClass.someMethod(P.java:40)
            at com.package.name.someClass.someMethod(P.java:4054)
    
  2. Если перехваченное исключение присутствует в любом другом следующем операторе журнала

    [2020-03-07 01:02:37.512]ERROR [L:xx F:yy T:zz R: C: ] xxxxxxx xxxxx xxxx xxxxxxxx xxxxxxxxxxxxxxxx 
    xxxxxxxxx xxxxxxxxxxx xxxxxxxx xxxx xxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxx xxxx NullPointerException
            at com.package.name(b.java:20)
            at com.package.name.someClass.someMethod(P.java:2423)
            at com.package.name.someClass.someMethod(P.java:40)
            at com.package.name.someClass.someMethod(P.java:4054)
    

Второй пример не соответствует упомянутому регулярному выражению .

Я также пытался использовать многострочный флаг (\ m) , но он не останавливается для случаев, когда он не должен совпадать

Пример

[2020-03-07 01:02:37.512]ERROR [L:xx F:yy1 T:zz1 R: C: ] xxxxxxx xxxxx xxxx xxxx
[2020-03-07 01:03:37.512]ERROR [L:xx F:yy2 T:zz2 R: C: ] xxxxxxx xxxxx xxxx xxxx
[2020-03-07 01:04:37.512]ERROR [L:xx F:yy3 T:zz3 R: C: ] xxxxxxx xxxxx xxxx xxxx 
[2020-03-07 01:05:37.512]ERROR [L:xx F:yy4 T:zz5 R: C: ] NullPointerException
            at com.package.name(b.java:20)
            at com.package.name.someClass.someMethod(P.java:2423)
            at com.package.name.someClass.someMethod(P.java:40)
            at com.package.name.someClass.someMethod(P.java:4054)

Ожидаемый результат

Группа 1: 2020-03-07 01: 05: 37.512 , Группа 2: F: yy4 , Группа 3: NullPointerException

Фактический результат

Группа 1: 2020-03-07 01: 02: 37,512 Группа 2: F: yy1 Группа 3: NullPointerException

Посмотрите, как после сопоставления первой строки она не останавливается, пока не найдет полное выражение.

Может кто-нибудь, пожалуйста, помогите мне здесь.

1 Ответ

2 голосов
/ 10 марта 2020

Вы можете проверить с начала шаблона, что следующая строка не начинается с, например, [ и di git, используя отрицательный прогноз (?!.*\R\[\d), так как впоследствии вы используете встроенные модификаторы (?sx).

Эта часть (F:[^ ]+|F:) может быть закорочена для соответствия F: и 0+ раз непробельный символ (F:\S*)

В классе символов [\d -:] дефис соответствует диапазону вместо только символ дефиса Если вы хотели буквально сопоставить его, вы можете, например, переместить его в конец и добавить соответствующую ему точку.

^(?!.*\R\[\d)\[([\d :.-]+)]ERROR.*?(F:\S*)(?sx).*?\b([a-zA-Z]*Exception)\b

Пояснение

  • ^ Начало строки
  • (?!.*\R\[\d) Отрицательный прогноз, утверждаем, что следующая строка не начинается с [ и di git, где \R соответствует последовательности новой строки в Unicode
  • \[ Матч [
  • ([\d :.-]+) Захват группа 1 , соответствие любому из перечисленных
  • ] Матч ]
  • ERROR.*? Совпадение с ошибкой и 0+ раз с любым символом, кроме новой строки
  • (F:\S*) Захват группа 2 , Совпадение F: и 0+ раз с непробельным символом
  • (?sx).*? Встроенный модификатор s создание точки, совпадающей с новой строкой и x для игнорирования пробела
  • \b([a-zA-Z]*Exception)\b Захват группа 3 , сопоставление 0+ раз с последующим символом a-zA-Z по исключению

Regex demo

Другой вариант без использования встроенного модификатора s для приведения точки в точку новой строки может быть необязательным соответствие всех строк, которые не содержат исключений, после соответствия ERROR и F: part.

^(?!.*\R\[\d)\[([\d :.-]+)]ERROR.*?(F:\S*)(?:(?!.*Exception|.*\R\[\d).*\R)*+.*\b([a-zA-Z]*Exception)\b

Regex demo

...