Почему это многострочное регулярное выражение содержит следующую строку? - PullRequest
2 голосов
/ 13 марта 2019

У меня есть следующие данные, и я хотел бы написать регулярное выражение, которое будет соответствовать каждой строке, кроме первой и последней.

2019-03-13 00:33:44,846 [INFO] -:  foo
2019-03-13 00:33:45,096 [INFO] -:  Exception sending email
To:
[foo@bar.com, bar@bar.com]
CC:
[baz@bar.com]
Subject:
some subject
Body:
some

body
2019-03-13 00:33:45,190 [INFO] -:  bar

Я думал, что следующее должно работать, но оно ничего не соответствует:

pcregrep -M ".+Exception sending email[\S\s]+?(?=\d{4}(-\d\d){2})" ~/test.log

В простом английском я бы описал это следующим образом: ищите строку с текстом исключения, за которым без жадности следует любой символ (включая символы новой строки), пока мы не встретим положительный прогноз на дату.

По некоторым причинам это также включает в себя последнюю строку, хотя это не относится к regex101 . Что мне здесь не хватает?


Во многих случаях я бы просто использовал grep -A в таком случае, но проблема в том, что телом может быть любое произвольное число строк.

1 Ответ

2 голосов
/ 13 марта 2019

Это почти наверняка связано с инструментом.В качестве changelog для pcregrep говорится в «Version 8.12 15-Jan-2011»:

В pcregrep, когда шаблон, оканчивающийся буквальной последовательностью новой строки, был сопоставлен в многострочном режиме, следующая строка отображалась как часть совпадения.Это кажется неправильным, поэтому я изменил его.

Простым исправлением будет добавление символа новой строки в выражении lookahead, которое вытащит его из соответствия и предотвратит последнюю строкуот показа:

pcregrep -M ".+Exception sending email[\S\s]+?(?=[\r\n]\d{4}(-\d\d){2})" ~/test.log
...