Как разделить лог файле Postgres Sql на части с помощью Regex
Нужно разделить лог файл на группы.
Написал такое выражение ([0-9]{4}.[0-9]{2}.[0-9]{2}.[0-9]{2}.[0-9]{2}.[0-9]{2}.[0-9]{3}|([+][0-9]{2})|([\[][0-9]{2,7}[\]])|([a-zA-zа-яА-ЯЙйЁё]{1,10}: ))
2022-07-08 17:59:13.857 +06 [15908] ОПЕРАТОР:
UPDATE "public"."Test"
SET
"date_one" = $1,
"date_two" = $2,
"result" = $3,
"statusId" = $4
WHERE
"Id" = $5
2022-07-08 17:59:13.862 +06 [6768] ОШИБКА: INSERT или UPDATE в таблице "Test" нарушает ограничение внешнего ключа "FKlrvReRFTdJZNKrNkZm26QesaeQw"
2022-07-08 17:59:13.945 +06 [15908] ОПЕРАТОР:
UPDATE "public"."Test"
SET
"date_one" = $1,
"date_two" = $2,
"result" = $3,
"statusId" = $4
WHERE
"Id" = $5
Данное выражение получает только первую часть: 2022-07-08 17:59:13.862 +06 [6768] ОШИБКА: Ссылка на Regex
Как можно получить часть с запросом, то есть то что находиться после запятой и до след. даты и т.д.?
Сейчас получаю массив:
["2022-07-08 17:59:13.862","+06","[6768]","ОШИБКА: "]
Нужно получить:
["2022-07-08 17:59:13.862","+06","[6768]","ОШИБКА: ", "Запрос... или описание ошибки"]
Ответы (1 шт):
using System.Text.RegularExpressions;
string input = File.ReadAllText("test.txt");
// language=regex
string pattern = @"
^
(?'date' \d{4}.\d{2}.\d{2}.\d{2}.\d{2}.\d{2}.\d{3})
\s
(?'zone' \+\d{2})
\s
(?'code' \[\d+\])
\s
(?'type' \w+)
:\s{2}
(?'text' .+?)
(?= ^\d{4} | \Z)
";
var options = RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace;
var matches = Regex.Matches(input, pattern, options);
foreach (Match match in matches)
{
var groups = match.Groups;
Console.WriteLine(groups["date"]);
Console.WriteLine(groups["zone"]);
Console.WriteLine(groups["code"]);
Console.WriteLine(groups["type"]);
Console.WriteLine(groups["text"]);
Console.WriteLine();
}
// language=regex - включит подсветку синтаксиса и подсказки в процессе набора.
^ - начало строки,
(?'имя' ) - именованная группа,
\d - цифра,
\w - любая буква,
(?= ) - позитивный просмотр вперёд: ищем начало строки и четыре цифры или конец строки.
Чтобы шаблон .+ захватывал многострочный текст, указываем опцию RegexOptions.Singleline.
RegexOptions.IgnorePatternWhitespace - добавлено для удобства написания шаблона регулярки - игнорирует пробельные символы. Поэтому настоящие пробелы нужно задавать только в виде \s.