【问题标题】:optional regex patten in td-agenttd-agent 中的可选正则表达式模式
【发布时间】:2017-03-21 10:18:26
【问题描述】:

我有两种不同格式的日志行,你可以用这个site做测试

我需要在下面的行中保留可选的客户端部分,如果存在则结束,否则它会忽略

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

日志行 - 无客户端

[2016 年 1 月 18 日星期一 21:55:58.239970] [proxy_http:error] [pid 2769:tid 140041068427008] AH01114:HTTP:无法连接到后端:xx.xxx.xx.xx

日志行 - 与客户

[2016 年 1 月 18 日星期一 21:55:58.239970] [proxy_http:error] [pid 2769:tid 140041068427008] [client xx.xxx.x.xx:10723] AH01114:HTTP:无法连接到后端:xx .xxx.xx.xx

我尝试过 (.*?clientsection) -> 0 个或多个匹配项

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

但它不起作用

【问题讨论】:

标签: ruby regex fluentd


【解决方案1】:

在您的第二个表达式中, (.*?(\[(?&lt;client&gt;[^\]]*)\])) 部分匹配一个必填空格,然后尽可能少地捕获任何 0+ 个字符,然后将除 ] 之外的 0+ 个字符捕获到“客户端”组中,然后匹配 @987654324 @ 将其放在编号的捕获组中。如果文本中缺少客户端部分,您的表达式将尝试匹配第一个空格,然后是 [...] 子字符串,然后再匹配一个空格。

如果您想修复正则表达式,您需要将“客户”组设为可选并确保相邻的上下文也设为可选。

(.*?(\[(?&lt;client&gt;[^\]]*)\])) 替换为(?: \[(?&lt;client&gt;[^\]]*)\])?。这里,(?:...)? 是一个可选的非捕获组,它不会创建子组(不捕获),并且仅当所有序列都存在时才会匹配其模式的 1 次或 0 次出现。

参见Rubular demo\n 被添加到否定字符类中,因为多行字符串用于测试)。

【讨论】:

    猜你喜欢
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 2015-01-10
    相关资源
    最近更新 更多