powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / регулярное выражение для захвата текста на нескольких строках
14 сообщений из 14, страница 1 из 1
регулярное выражение для захвата текста на нескольких строках
    #39628592
NewIvanovec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть лог веб сервера Tomcat - tomcat.log.
Логически видно, что там 3 поля - дата события, уровень критичности и расшифровка ошибки.
Проблема в том, что расшифровка может состоять из нескольких строк.
Каким макаром регулярным выражением можно поймать расшифровку ?
начал делать скрипт в powershell, дату и уровень критичности выцепляю, а как найти расшифровку не могу придумать
Код: powershell
1.
2.
3.
4.
5.
6.
7.
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.Уровень}

#Дата и уровень ошибки выводятся, осталось высветить расшифровку
...
Рейтинг: 0 / 0
регулярное выражение для захвата текста на нескольких строках
    #39628593
NewIvanovec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
регулярное выражение для захвата текста на нескольких строках
    #39628597
NewIvanovec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
регулярное выражение для захвата текста на нескольких строках
    #39628719
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NewIvanovec,

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


Он матчится с любыми символами до тех пор, пока не встретится перевод строки, после которого нет пробела.
...
Рейтинг: 0 / 0
регулярное выражение для захвата текста на нескольких строках
    #39628919
NewIvanovec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyNewIvanovec,

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


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

Большое СПАСИБО!!!
...
Рейтинг: 0 / 0
регулярное выражение для захвата текста на нескольких строках
    #39629674
NewIvanovec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyNewIvanovec,

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


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

Анатолий, целый день не могу додуматься как немного допилить замечательный Регекс :)
я хочу, чтобы матчился сразу весь блок от Error до WARN
а сейчас этот блок с помощью Регекса матчится 3-мя блоками.
если получится захватить весь блок или хотя бы половину блока то я смогу сделать себе подробное информирование
Если сверкнёт мысль как сразу поймать блок из нескольких строк, поделитесь, пожалуйста
...
Рейтинг: 0 / 0
регулярное выражение для захвата текста на нескольких строках
    #39629778
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NewIvanovec,

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

Код: sql
1.
(\n(?!\d\d-\d\d-\d\d)|[^\n])+


Здесь матчится любой текст, пока не встретится перевод строки, после которого идет дата (сама дата не матчится - это и есть lookahead).
...
Рейтинг: 0 / 0
регулярное выражение для захвата текста на нескольких строках
    #39629780
NewIvanovec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyNewIvanovec,

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

Код: sql
1.
(\n(?!\d\d-\d\d-\d\d)|[^\n])+


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

Откуда Вы такой :)
Спасибо!!
...
Рейтинг: 0 / 0
регулярное выражение для захвата текста на нескольких строках
    #39630164
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NewIvanovec,
у regexp есть режимы работы. в них есть как раз настройки иностранный поиск или однострочный.

все это зависит от того, какую библиотеку regex ты используешь.
...
Рейтинг: 0 / 0
регулярное выражение для захвата текста на нескольких строках
    #39630176
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут надо быть осторожным. Логи - обычно не ограничиваются по размеру и после
применения матчера к такой толстой строке, мы получаем в общем случае толстое
дерево объектов которое соизмеримо с логом. Впрочем все это зависит от реализации
матчера.
...
Рейтинг: 0 / 0
регулярное выражение для захвата текста на нескольких строках
    #39630238
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут проще строками отлавливать по ERROR, Handling error
и по 1й строке обрабатывать, чтобы память не засрать
...
Рейтинг: 0 / 0
регулярное выражение для захвата текста на нескольких строках
    #39630239
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78тут проще строками отлавливать по ERROR, Handling error
и по 1й строке обрабатывать, чтобы память не засрать
точнее строками, а блоками
нашёл ERROR -> обработал -> забыл
...
Рейтинг: 0 / 0
регулярное выражение для захвата текста на нескольких строках
    #39632397
NewIvanovec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На сайте https://regex101.com/ и в notepad++
шаблон
(\d\d-\d\d-\d\d \d\d:\d\d:\d\d)(,\d\d\d )(INFO|ERROR|WARN)([\s:]{2,3})(\n(?!\d\d-\d\d-\d\d)|[^\n])+
работает как надо: в первую группу матчится дата, в 3-ю группу матчится уровень сообщения, в 5-ую группу матчится текст до следующей строки с датой,
но почему-то в POwershell и в C# работает не как надо, а как-то по-другому.
В Powershell весь текст всего файла съедается за раз
Код: powershell
1.
2.
3.
4.
$text = Get-Content -path D:\tomcat.log
$pattern_yellow = "(\d\d-\d\d-\d\d \d\d:\d\d:\d\d)(,\d\d\d )(INFO|ERROR|WARN)([\s:]{2,3})(\n(?!\d\d-\d\d-\d\d)|[^\n])+"
$AllMatches1 = [regex]::matches($text,$pattern_yellow)
$AllMatches1 



а в с# дата и уровень сообщения матчятся, а текст нет
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
string pattern_all = "(\\d\\d-\\d\\d-\\d\\d \\d\\d:\\d\\d:\\d\\d)(,\\d\\d\\d )(INFO|ERROR|WARN)([\\s:]{3})(\\n(?!\\d\\d-\\d\\d-\\d\\d)|[^\\n])+";
            string s = File.ReadAllText(@"D:\tomcat.log");            
            Regex regex = new Regex(pattern_all);
            MatchCollection matches = regex.Matches(s);
            if (matches.Count > 0)
            {
                foreach (Match match in matches)
                    Console.WriteLine("Дата = " + match.Groups[1] + " уровень = " + 
                        match.Groups[3] + " текст = " + match.Groups[5]);
                     //Console.WriteLine("Дата = " + match.Groups["Дата"] + " уровень = " + 
                    Console.ReadKey();
            }
            else
            {
                Console.WriteLine("Совпадений не найдено");
                Console.ReadKey();
            }



что нибудь можно придумать, чтобы или в PS или c# тоже работало ?
...
Рейтинг: 0 / 0
регулярное выражение для захвата текста на нескольких строках
    #39632400
NewIvanovec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NewIvanovec,
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / регулярное выражение для захвата текста на нескольких строках
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]