Fluentd Несколько регулярных выражений с именем Captures

Можем ли мы объединить несколько регулярных выражений именованных захватов?

Я пытаюсь использовать следующее регулярное выражение в файле confentd conf, чтобы получить "User" и "Serial_Number", но смог получить только имя (User).

TD-agent.conf:

<source>
   type tail
   format /(?<User>(?<=user:).*?(?=\]))(?<Serial_Number>(?<=sn:).*?(?=\]))/
   tag xxxxxx
   path /app/logs/xxxx.log
   pos_file /var/log/td-agent/xxxx_rolling.pos
</source>

Журнальный файл:

Jul24,11:20:17 TID:6 INFO [user:weblogic] [sn:088039] [dur:806ms] {***message}

Я новичок в этом формате регулярных выражений в fluentD и был бы признателен за любую помощь в этом вопросе.

-Praveen

1 ответ

Решение

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

Вам лучше использовать классы с отрицательными символами, и вам нужно разрешить любые символы между пользователем и sn:

/(?<User>(?<=user:)[^]]*)\].*?(?<Serial_Number>(?<=sn:)[^]]*)?\]/
                   ^^^^  ^^^^^                         ^^^^  ^^

Посмотреть демо

[^]]* класс отрицанных символов будет соответствовать 0 или более символов, кроме ] а также .* будет соответствовать 0 или более символов, кроме новой строки.

Если вам нужно сопоставить подтексты в любом порядке, вы также можете использовать

/^(?=.*(?:(?<User>(?<=user:)[^]]*)))(?=(?:.*(?<Serial_Number>(?<=sn:)[^]]*))?)/

Смотрите второе демо

Другие вопросы по тегам