Группа захвата регулярных выражений пропускает экранированные строки

#regex #regex-group

Вопрос:

В настоящее время я работаю с Splunk, чтобы просмотреть некоторые из моих журналов, и я столкнулся с некоторыми проблемами с регулярными выражениями. Прямо сейчас у меня есть журналы в нескольких разных форматах. Когда я создавал регулярное выражение, я сбрасывал JsonConvert.Serialize() в свой журнал, который просто сбрасывал версию json моих объектов, которая работала хорошо. Однако теперь я сбрасываю только текст и, похоже, не могу сопоставить регулярное выражение с моей группой захвата.

 {"line":"(?<time>. )|(?<log_level>. )|(?<Controller>. )|(?<Message>. )}"
 

Мое текущее регулярное выражение приведено выше и соответствует первым двум. Обратите внимание, как она заканчивается фигурной скобкой

 {"line":"18:48:17.990|INFO|PController|Plex event is media.pause}","source":"stdout","tag":"4e263fa2001d"}

{"line":"22:38:47.839|INFO|PController|{"Id":"SMf1bc2466b1","ErrorMessages":null}","source":"stdout","tag":"b5fcd8b8b5a4"}

{"line":"22:38:47.839|INFO|PController|This is another test","source":"stdout","tag":"b5fcd8b8b5a4"}

{"line":"18:56:37.212|INFO|PController|media.stop","source":"stdout","tag":"4e263fa2001d"}
 

По сути, регулярное выражение должно анализировать json из журнала и извлекать поля в указанные группы захвата. Это хорошо работает для журнала # 1 и журнала # 2, но не работает для журнала # 3 и журнала # 4, потому что у него нет конечной фигурной скобки.
ogregex

Я также пытался

 {"line":"(?<time>. )|(?<log_level>. )|(?<Controller>. )|(?<Message>. )",
 

но это соответствует до конца «источника»: «стандартный вывод», а не до конца моего тега строки.
введите описание изображения здесь

Я пытаюсь включить в группу захвата «Сообщение» любые возможные символы, включая кавычки, фигурные скобки и, в основном, любой специальный символ. Я просто пытаюсь извлечь время, уровень журнала, контроллер и сообщение из полной строки Json.

Ответ №1:

Если я правильно понимаю, ваше групповое «Сообщение» может содержать либо фигурную скобку с дополнительными кавычками, либо без фигурной скобки.
Затем вам нужно проверить обе возможности в вашем регулярном выражении:

 {"line":"(?<time>. )|(?<log_level>. )|(?<Controller>. )|(?<Message>. }|. ?)"
 

Обратите внимание, что в случае без фигурной скобки мы используем a ? , чтобы остановиться на следующей кавычке (ленивое выражение вместо жадного)
ДЕМОНСТРАЦИЯ

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

1. Однако в вашей первой строке что-то не так: количество закрывающих скобок не соответствует количеству открывающих…

2. Привет, Tranbi, регулярное выражение соответствует этому выражению, только если оно заканчивается фигурной скобкой и кавычкой, поэтому я пытался выяснить, почему оно не соответствовало, когда я получил свое первое сообщение без сериализации JSON, и я понял, что если у меня есть группа сообщений, заканчивающаяся фигурной скобкой (даже если онау меня не было начального), это соответствовало бы. Это был просто пример. И спасибо, это было идеально. Я думаю, что? для greedy было то, что я пропустил, что бы очень помогло.