2015-06-28 55 views
2

我有特定的日誌消息,我想將其解析爲組。如果我的字符串更具體,我想製作一個替代版本。正則表達式 - 將字符串解析爲組

我的日誌:

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個組,如果它們存在的話:方法和行

所以,我想獲得這樣的結果:

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或僅解析Line2,但我想用一個正則表達式解析它們。

+1

您正在運行哪個lang?你的嘗試在哪裏? –

+0

你正在使用哪種開發環境/語言?請爲您的問題添加適當的標籤!另外,請提供您已經編寫的正則表達式! –

+0

我在外部應用程序中使用它。我認爲它是Java。 我更新了我的當前狀態正則表達式 – Tomasz

回答

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參見

我加入2-非捕獲組可選的基團和一個?量詞(?:...)?稱爲methodline

我建議使用(?<method>[^']*)捕捉比'其他捕獲方法名的所有符號,並Line:\s*(?<line>.+)\.捕捉line,因爲我不知道,你可能有什麼存在的文本是太貪婪。您實際上可以將(?<line>.+)部分調整爲一些更具限制性的模式(我想到了~?\d+,但不知道您是否有冒號或其他任何內容)。

+0

好的!謝謝 – Tomasz

+0

如果您對此有任何疑問,請不要猶豫,要求澄清。我在答案中發表了上面的一些注意事項。 –

相關問題