我正在尝试使用regex解析一个日志文件,问题是一旦我打开SingleLine模式,我就可以包含多行错误,这样以后的匹配就会包含在第一个匹配中,而不是自己的匹配中。
为了更好地解释,下面是一个日志文件的示例:
错误16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf 错误16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf 测试 错误16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf 错误16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf 资讯16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf 试验2 错误16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf 错误16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf
我使用以下正则表达式:
.{5} \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} - .+这将正确匹配每一行,但不包括已在新行上运行的消息部分。但是当我打开单线模式时,只有一个匹配项(第一个),所有其他条目都包含在其中。
谁能给我指明正确的方向?
谢谢:)
发布于 2012-08-17 14:47:03
基本上,这个解决方案背后的想法是告诉您的正则表达式不是包含什么,而是停止在哪里。
此正则表达式使用正的前瞻性,在正则表达式的下一次出现时(或在整个字符串的末尾)不贪婪地停止。
.{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行看作单个错误消息(而不是前一条错误消息的一部分),您可以考虑使用这个regexp。
.{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})发布于 2012-08-17 14:56:24
从您的示例文本文件看,可能有一些空行。如果可以的话,您应该可以使用这个regex:
^(?: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)
由于regexp中没有匹配组,所以我使用了(?:...)非匹配变量。
https://stackoverflow.com/questions/12007398
复制相似问题