необязательный шаблон регулярного выражения в td-agent

У меня есть два разных формата строк логов, вы можете протестировать их на этом сайте

Мне нужно сохранить необязательный клиентский раздел в строке ниже, если он присутствует, он завершается, иначе он игнорируется

\[(?<date>[^\]]*)\] \[(?<level>[^\]]*)\] \[(?<pid-tid>[^\]]*)\] (\[(?<client>[^\]]*)\]) (?<message>[^\]]*)

Линии журнала — без клиента

[Пн, 18 января, 21:55:58.239970 2016] [proxy_http:error] [pid 2769:tid 140041068427008] AH01114: HTTP: не удалось установить соединение с серверной частью: xx.xxx.xx.xx

Линии журнала — с клиентом

[Пн, 18 января, 21:55:58.239970 2016] [proxy_http:ошибка] [pid 2769:tid 140041068427008] [клиент xx.xxx.x.xx:10723] AH01114: HTTP: не удалось установить соединение с серверной частью: xx.xxx. хх.хх

Я пробовал как (.*?clientsection) -> 0 или более совпадений

\[(?<date>[^\]]*)\] \[(?<level>[^\]]*)\] \[(?<pid-tid>[^\]]*)\] (.*?(\[(?<client>[^\]]*)\])) (?<message>[^\]]*)

Но это не работает


person Bilal Usean    schedule 21.03.2017    source источник
comment
Посмотрите эту демонстрацию.   -  person Wiktor Stribiżew    schedule 21.03.2017


Ответы (1)


Во втором выражении часть (.*?(\[(?<client>[^\]]*)\])) соответствует обязательному пробелу, а затем захватывает любые символы 0+, как можно меньше, затем захватывает символы 0+, отличные от ], в группу «клиент», а затем соответствует ], помещая его в пронумерованную группу захвата. Если в тексте отсутствует клиентская часть, ваше выражение попытается сопоставить первый пробел, затем подстроку [...] и снова пробел.

Если вы хотите исправить регулярное выражение, вам нужно сделать группу "client" необязательной и убедиться, что смежный контекст также является необязательным.

Замените (.*?(\[(?<client>[^\]]*)\])) на (?: \[(?<client>[^\]]*)\])?. Здесь (?:...)? — необязательная группа без захвата, которая не будет создавать подгруппу (без захвата) и будет соответствовать 1 или 0 вхождениям своего шаблона, только если присутствует вся эта последовательность.

См. демонстрацию Rubular (\n добавлено к отрицательным классам символов, так как для тестирования используется многострочная строка) .

person Wiktor Stribiżew    schedule 21.03.2017