我有特定的日志消息,我想将其解析为组。如果我的字符串更具体,我想制作一个替代版本。
我的日志:
18:48:24:284 => [DEBUG] [xxx.yyy.zzz] [8] Message1
18:48:24:671 => [INFO] [uuu.www.aaa] [8] Method: 'ReturnType MethodName(MethodParameter)'. Line: ~30. Message2
我写了以下正则表达式:
(?<timestamp>\d+:\d+:\d+:\d+.*)\s+=>\s+\[(?<level>\w+)\]\s+\[(?<emmiter>.*)\]\s+\[(?<thread>\d+)\]\s+(?<message>.*)
它将这些消息解析为特定的组:
timestamp: 18:48:24:284
level: DEBUG
emmiter: xxx.yyy.zzz
thread: 8
message: Message1
timestamp: 18:48:24:671
level: INFO
emmiter: uuu.www.aaa
thread: 8
message: Method: 'ReturnType MethodName(MethodParameter)'. Line: ~30. Message2
但是现在我想再添加2个组,以防它们存在:method和Line
所以,我想得到这样的结果:
timestamp: 18:48:24:284
level: DEBUG
emmiter: xxx.yyy.zzz
thread: 8
method:
line:
message: Message1
timestamp: 18:48:24:671
level: INFO
emmiter: uuu.www.aaa
thread: 8
method: ReturnType MethodName(MethodParameter)
line: ~30
message: Message2
你可以帮我解决这个问题吗?我所做的一切都只能正确地解析Line1
或{+ 1}},但我想用一个正则表达式解析它们。
答案 0 :(得分:2)
我可以建议以下正则表达式:
(?<timestamp>\d+:\d+:\d+:\d+.*)\s+=>\s+\[(?<level>\w+)\]\s+\[(?<emmiter>.*)\]\s+\[(?<thread>\d+)\](?:\s+Method:\s'(?<method>[^']*)'\s*\.)?(?:\s*Line:\s*(?<line>.+)\.)?\s*(?<message>.*)
^^^^^^ ^ ^^^^ ^
请参阅demo here
我添加了两个包含非捕获组的可选组和一个名为?
和(?:...)?
的{{1}}量词method
。
我建议使用line
来捕获除(?<method>[^']*)
以外的所有符号以捕获方法名称,并使用'
来捕获过于贪心的Line:\s*(?<line>.+)\.
因为我不确定是什么你可能在那里的文字。您实际上可以将line
部分调整为更严格的模式(我想到(?<line>.+)
但不知道您是否有冒号或其他任何东西)。