可选择在正则表达式组

时间:2017-12-03 05:16:07

标签: regex

我正在使用正则表达式来解析nginx日志。

我正在创建的其中一个字段是“消息”。有时这个组将包含一个JSON字符串。

如何在我的“消息”组中选择性地匹配以创建“json”组?

这是我现在的正则表达式:

(?<time>\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}) \[(?<log_level>\w+)\] (?<pid>\d+).(?<tid>\d+): (?<message>.*)

以下是一条示例消息:

2017/12/02 12:45:40 [debug] 29#29: *7895 [lua] auth_client.lua:41: {"applicationName":"nginx", "applicationFunction":"auth-client" ,"logLevel": "DEBUG", "clientId":"xyz","requestId":"72e03798e9826f2c4b076e3779903edf","message":"Checking client credentials"}

使用我目前的正则表达式,我得到一个字段:

message: *7895 [lua] auth_client.lua:41: {"applicationName":"nginx-auth-filter", "applicationFunction":"auth-client" ,"logLevel": "DEBUG", "clientId":"ifly","requestId":"72e03798e9826f2c4b076e3779903edf","message":"Checking client credentials"}

我想要的是:

message: *7895 [lua] auth_client.lua:41: {"applicationName":"nginx-auth-filter", "applicationFunction":"auth-client" ,"logLevel": "DEBUG", "clientId":"ifly","requestId":"72e03798e9826f2c4b076e3779903edf","message":"Checking client credentials"}
json: {"applicationName":"nginx-auth-filter", "applicationFunction":"auth-client" ,"logLevel": "DEBUG", "clientId":"ifly","requestId":"72e03798e9826f2c4b076e3779903edf","message":"Checking client credentials"}

但是,有时消息不包含json,因此该组应该是可选的。

1 个答案:

答案 0 :(得分:0)

您可以将此正则表达式与json string的可选组一起使用:

(?<time>\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}) \[(?<log_level>\w+)\] (?<pid>\d+).(?<tid>\d+): (?<message>[^{]*(?<json>\{.*\})?.*)

这假设json文本以第一个{开头,并以消息组中的最后一个}结束。

RegEx Demo