2012-08-17 214 views
0

我想使用正則表達式解析日誌文件,問題是一旦我打開SingleLine模式,以便可以包含多行錯誤未來的比賽包括在第一場比賽中,而不是他們自己的比賽。在正則表達式中匹配字符(包括換行符)直到找到下一個匹配

更好地說明,這裏是一個日誌文件的例子:

ERROR 11月16日至8日:09:59015 - sdsdfsdfsdfsdfsdf

ERROR 11月16日至8日:09:59015 - sdsdfsdfsdfsdfsdf

測試

ERROR 11月16日至8日:09:59015 - sdsdfsdfsdfsdfsdf

ERROR 16-08 11:09: 59015 - sdsdfsdfsdfsdfsdf

INFO 11月16日至8日:09:59015 - sdsdfsdfsdfsdfsdf

試驗2

ERROR 11月16日至8日:09:59015 - sdsdfsdfsdfsdfsdf

ERROR 16-08 11:09 :59015 - sdsdfsdfsdfsdfsdf

我使用正則表達式如下:

.{5} \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} - .+ 

這將正確匹配每行,但排除已經運行到新行的消息部分。但是當我打開單線模式時,只有一個匹配(第一個),並且所有其他條目都包含在其中。

任何人都可以指向正確的方向嗎?

謝謝:)

+0

你想包含'INFO'也作爲錯誤信息的一部分嗎?如果你明確告訴我們你想要什麼和你不想要什麼,那將會更容易。另外,粘貼確切的日誌文件。我們可以從那個文件中想到更多的分隔符 – 2012-08-17 14:36:14

回答

1

基本上這個解決方案背後的理念是要告訴你的正則表達式不包括什麼,但在哪裏停止

此正則表達式使用正先行在您正則表達式(或在整個字符串的末尾)

.{5} \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} - .+? 
    (?=(.{5} \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3})|\z) 

這也包括INFO線與先前錯誤消息的一部分的下一次出現nongreedily停止。這聽起來有點越野車,所以,如果你要考慮INFO線作爲單錯誤信息(而不是以前的一個組成部分),你可以考慮使用這個正則表達式,而不是

.{4,5} \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} - .+? 
(?=.{4,5} \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3}) 
+0

我不確定我是否得到了兩個正則表達式之間的不同,這兩個正則表達式似乎都在做這個工作(我在原始問題中忘記提及,但ERROR/INFO似乎是一個固定長度之後是空格,所以INFO後面跟着兩個空格)。另外你如何看待前面的部分,以匹配下一個日誌條目或日誌的結尾?因爲它不匹配最後一個錯誤 – Paul 2012-08-18 16:38:33

+0

查看第一個正則表達式,\ Z應該允許匹配最終的日誌條目,即使我將\ z更改爲'結束'並將'結束'放在日誌末尾文件它沒有拿起它? – Paul 2012-08-18 16:48:52

+0

這對我來說也是一種莫名其妙,從我假設你使用的.net標籤中,我會做一些測試來理解。信息部分的問題是,在你的例子中,它後面只有一個空格。如果你說在真正的問題,它有兩個空格,那麼沒關係 – Gabber 2012-08-20 07:02:56

1

從你的示例文本文件,它看起來像可能有一些空行。如果這沒關係,你應該能夠使用正則表達式:

^(?:ERROR) \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} - (?:(?!ERROR|INFO)(?:[a-z0-9A-Z ,:\-\t]*)\n)+ 

如果這只是一個錯誤,空行不想要的,取代去年+*

^(?:ERROR) \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} - (?:(?!ERROR|INFO)(?:[a-z0-9A-Z ,:\-\t]*)\n)* 

這不會匹配INFO一行,但是你寫道你只想要錯誤。 如果有一些其他的消息格式(如WARNING也許),你必須包括他們進入這一部分:(?!ERROR|INFO)

既然你已經在你的正則表達式沒有匹配的羣體,我用(?:...)非匹配變量。

+0

嗨,你是正確的,這是一個錯誤,由於降價,我想它匹配錯誤/信息等,唯一的問題是,這不匹配的最後一行,有沒有一種方式說'或字符串的結束'作爲它應該匹配的最後一件事? – Paul 2012-08-18 16:33:55

+0

你是對的,我忘了 - 如果你把'\ n'改成'(?:\ n | \ Z)'('\ Z'作爲字符串的結尾),它應該可以工作。 – 2012-08-20 09:57:25

相關問題