我目前正在为我们的内部日志文件(由 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}\]))+)