流利的多个正则表达式名为Captures

时间:2015-07-29 19:33:47

标签: regex fluentd

我们可以连接多个名为capture的正则表达式吗?

我尝试在流利的配置文件中使用以下正则表达式来获取"用户" &安培; "序列号"但只能获得名字(用户)。

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 个答案:

答案 0 :(得分:0)

&#34;串联&#34;在这种情况下没有必要,你只需要在第一个捕获组和第二个捕获组之间允许任意数量的任意字符。

你最好使用否定的字符类,你需要让用户和sn之间的任何字符:

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

请参阅demo

[^]]*否定字符类将匹配除]之外的0个或更多字符,而.*将匹配除换行符之外的0个或更多字符。

如果您需要以任何顺序匹配子文件,您也可以使用

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

请参阅the second demo