4

我们可以连接多个命名捕获的正则表达式吗?

我正在尝试在 fluentd conf 文件中使用以下正则表达式来获取“用户”和“序列号”,但只能获取名字(用户)。

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 中这种正则表达式格式的新手,希望能在这个问题上提供任何帮助。

-普拉文

4

1 回答 1

2

在这种情况下,“连接”不是必需的,您只需要在第一个捕获组和第二个捕获组之间允许一些任意数量的任意字符。

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

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

演示

否定字符类将[^]]*匹配 0 个或多个字符,然后].*匹配 0 个或多个字符,而不是换行符。

如果您需要以任何顺序匹配潜台词,您也可以使用

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

第二个演示

于 2015-07-29T19:39:34.207 回答