匹配正则表达式中的字符(包括换行符)直到下一个匹配

时间:2012-08-17 14:07:55

标签: .net regex

我正在尝试使用正则表达式解析日志文件,问题是我打开SingleLine模式以便我可以包含多行错误,然后未来的匹配包含在第一个匹配中而不是他们自己的匹配中。

为了更好地解释,这是一个日志文件的例子:

  

ERROR 16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf

     

ERROR 16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf

     

测试

     

ERROR 16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf

     

ERROR 16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf

     

INFO 16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf

     

测试2

     

ERROR 16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf

     

ERROR 16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf

我正在使用以下正则表达式:

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

这会正确匹配每一行,但不包括已运行到新行的消息部分。但是当我打开单线模式时,只有一个匹配(第一个),所有其他条目都包含在其中。

有人能指出我正确的方向吗?

谢谢:)

2 个答案:

答案 0 :(得分: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行作为上一个错误消息的一部分。这听起来有点儿麻烦,所以,如果您想将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})

答案 1 :(得分: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)

由于您的正则表达式中没有匹配的组,因此我使用了(?:...)非匹配变体。