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:)[^]]*))?)/
Смотрите второе демо