#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, потому что у него нет конечной фигурной скобки.
Я также пытался
{"line":"(?<time>. )|(?<log_level>. )|(?<Controller>. )|(?<Message>. )",
но это соответствует до конца «источника»: «стандартный вывод», а не до конца моего тега строки.
Я пытаюсь включить в группу захвата «Сообщение» любые возможные символы, включая кавычки, фигурные скобки и, в основном, любой специальный символ. Я просто пытаюсь извлечь время, уровень журнала, контроллер и сообщение из полной строки Json.
Ответ №1:
Если я правильно понимаю, ваше групповое «Сообщение» может содержать либо фигурную скобку с дополнительными кавычками, либо без фигурной скобки.
Затем вам нужно проверить обе возможности в вашем регулярном выражении:
{"line":"(?<time>. )|(?<log_level>. )|(?<Controller>. )|(?<Message>. }|. ?)"
Обратите внимание, что в случае без фигурной скобки мы используем a ?
, чтобы остановиться на следующей кавычке (ленивое выражение вместо жадного)
ДЕМОНСТРАЦИЯ
Комментарии:
1. Однако в вашей первой строке что-то не так: количество закрывающих скобок не соответствует количеству открывающих…
2. Привет, Tranbi, регулярное выражение соответствует этому выражению, только если оно заканчивается фигурной скобкой и кавычкой, поэтому я пытался выяснить, почему оно не соответствовало, когда я получил свое первое сообщение без сериализации JSON, и я понял, что если у меня есть группа сообщений, заканчивающаяся фигурной скобкой (даже если онау меня не было начального), это соответствовало бы. Это был просто пример. И спасибо, это было идеально. Я думаю, что? для greedy было то, что я пропустил, что бы очень помогло.