我有两种不同格式的日志行,您可以使用此site
进行测试我需要在下面的行中保留可选的客户端部分,如果它存在则结束,否则忽略
\[(?<date>[^\]]*)\] \[(?<level>[^\]]*)\] \[(?<pid-tid>[^\]]*)\] (\[(?<client>[^\]]*)\]) (?<message>[^\]]*)
日志行 - 没有客户
[Mon Jan 18 21:55:58.239970 2016] [proxy_http:error] [pid 2769:tid 140041068427008] AH01114:HTTP:无法连接到后端:xx.xxx.xx.xx
记录行 - 使用客户
[Mon Jan 18 21:55:58.239970 2016] [proxy_http:error] [pid 2769:tid 140041068427008] [client xx.xxx.x.xx:10723] AH01114:HTTP:无法连接到后端:xx .xxx.xx.xx
我试过(。*?clientsection) - &gt; 0场或更多场比赛
\[(?<date>[^\]]*)\] \[(?<level>[^\]]*)\] \[(?<pid-tid>[^\]]*)\] (.*?(\[(?<client>[^\]]*)\])) (?<message>[^\]]*)
但它不起作用
答案 0 :(得分:1)
在你的第二个表达式中, (.*?(\[(?<client>[^\]]*)\]))
部分匹配一个强制性空格,然后尽可能少地捕获任何0+字符,然后捕获除]
以外的0 +字符到&#34; client& #34;组,然后匹配]
将其放在编号的捕获组中。如果文本中缺少客户端部分,则表达式将尝试匹配第一个空格,然后是[...]
子字符串,然后是空格。
如果你想修复正则表达式,你需要制作&#34;客户端&#34;分组可选并确保相邻的上下文也是可选的。
将 (.*?(\[(?<client>[^\]]*)\]))
替换为(?: \[(?<client>[^\]]*)\])?
。在这里,(?:...)?
是一个可选的非捕获组,它不会创建任何子组(没有捕获),并且只有当所有序列都存在时才匹配其模式的1或0次出现。
请参阅Rubular demo(\n
已添加到否定字符类,因为多行字符串用于测试。