我目前正在爲我們的內部日誌文件(由log4php,log4net和log4j生成)解析器。到目前爲止,我有一個很好的正則表達式來解析日誌,除了一個惱人的位:一些日誌消息跨越多行,我無法正確匹配。正則表達式我現在是這樣的:使用正則表達式解析日誌文件
(?<date>\d{2}/\d{2}/\d{2})\s(?<time>\d{2}):\d{2}:\d{2}),\d{3})\s(?<message>.+)
的日誌格式(我用於測試的解析器)是這樣的:
07/23/08 14:17:31,321 log
message
spanning
multiple
lines
07/23/08 14:17:31,321 log message on one line
當我現在運行解析器,我只得到線日誌開始。如果我將其更改爲跨越多行,則只會得到一個結果(整個日誌文件)。
@samjudson:
您需要通過RegexOptions.Singleline標誌正則表達式,從而使 「」匹配所有字符,而不僅僅是除了新行之外的所有字符(這是默認值)。
我試過了,但是它匹配了整個文件。我也嘗試將消息組設置爲。+? (非貪婪),但它匹配單個字符(這不是我正在尋找的)。
問題是,該消息的模式也與日期組相匹配,所以當它不在新行上斷開時,它只會繼續前進。
我現在使用這個正則表達式作爲消息組。它的工作原理是,除非日誌消息中的模式與日誌消息的開頭相同。
(?<message>(.(?!\d{2}/\d{2}/\d{2}\s\d{2}:\d{2}:\d{2},\d{3}\s\[\d{4}\]))+)