正则表达式 - 将字符串解析为组

时间:2015-06-28 17:23:15

标签: java regex

我有特定的日志消息,我想将其解析为组。如果我的字符串更具体,我想制作一个替代版本。

我的日志:

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}},但我想用一个正则表达式解析它们。

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>.+)但不知道您是否有冒号或其他任何东西)。