регулярное выражение для захвата текста на нескольких строках

NewIvanovec
Дата: 11.04.2018 16:55:23
Есть лог веб сервера Tomcat - tomcat.log.
Логически видно, что там 3 поля - дата события, уровень критичности и расшифровка ошибки.
Проблема в том, что расшифровка может состоять из нескольких строк.
Каким макаром регулярным выражением можно поймать расшифровку ?
начал делать скрипт в powershell, дату и уровень критичности выцепляю, а как найти расшифровку не могу придумать
cls
$pattern_data = "(?<Дата>\d\d-\d\d-\d\d \d\d:\d\d:\d\d)"
$pattern_level = "(?<Уровень>INFO|ERROR|WARN)"
$tomcat = Get-Content "D:\tmp\tomcat.log"
$tomcat | where {$_  -match $pattern_data +",\d\d\d " + $pattern_level}| foreach {$Matches.Дата, $Matches.Уровень}

#Дата и уровень ошибки выводятся, осталось высветить расшифровку
NewIvanovec
Дата: 11.04.2018 16:55:50
NewIvanovec
Дата: 11.04.2018 16:58:42
Anatoly Moskovsky
Дата: 11.04.2018 20:41:49
NewIvanovec,

Регекс для желтого:
(\n\s|[^\n])+

Он матчится с любыми символами до тех пор, пока не встретится перевод строки, после которого нет пробела.
NewIvanovec
Дата: 12.04.2018 10:41:25
Anatoly Moskovsky
NewIvanovec,

Регекс для желтого:
(\n\s|[^\n])+

Он матчится с любыми символами до тех пор, пока не встретится перевод строки, после которого нет пробела.


Большое СПАСИБО!!!
NewIvanovec
Дата: 13.04.2018 10:34:01
Anatoly Moskovsky
NewIvanovec,

Регекс для желтого:
(\n\s|[^\n])+

Он матчится с любыми символами до тех пор, пока не встретится перевод строки, после которого нет пробела.


Анатолий, целый день не могу додуматься как немного допилить замечательный Регекс :)
я хочу, чтобы матчился сразу весь блок от Error до WARN
а сейчас этот блок с помощью Регекса матчится 3-мя блоками.
если получится захватить весь блок или хотя бы половину блока то я смогу сделать себе подробное информирование
Если сверкнёт мысль как сразу поймать блок из нескольких строк, поделитесь, пожалуйста
Anatoly Moskovsky
Дата: 13.04.2018 12:43:39
NewIvanovec,

Поскольку продолжения строк как оказывается может быть и без начального пробела, то тут нужен другой подход - с помощью так называемого negative lookahead (если ваш движок регексов его поддерживает).

(\n(?!\d\d-\d\d-\d\d)|[^\n])+

Здесь матчится любой текст, пока не встретится перевод строки, после которого идет дата (сама дата не матчится - это и есть lookahead).
NewIvanovec
Дата: 13.04.2018 12:50:18
Anatoly Moskovsky
NewIvanovec,

Поскольку продолжения строк как оказывается может быть и без начального пробела, то тут нужен другой подход - с помощью так называемого negative lookahead (если ваш движок регексов его поддерживает).

(\n(?!\d\d-\d\d-\d\d)|[^\n])+

Здесь матчится любой текст, пока не встретится перевод строки, после которого идет дата (сама дата не матчится - это и есть lookahead).


Откуда Вы такой :)
Спасибо!!
MasterZiv
Дата: 14.04.2018 06:37:32
NewIvanovec,
у regexp есть режимы работы. в них есть как раз настройки иностранный поиск или однострочный.

все это зависит от того, какую библиотеку regex ты используешь.
mayton
Дата: 14.04.2018 10:04:03
Тут надо быть осторожным. Логи - обычно не ограничиваются по размеру и после
применения матчера к такой толстой строке, мы получаем в общем случае толстое
дерево объектов которое соизмеримо с логом. Впрочем все это зависит от реализации
матчера.