Как разделить лог файле 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 шт):

Автор решения: Alexander Petrov
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.

→ Ссылка