0

我正在尝试使用正则表达式解析日志文件,问题是一旦我打开 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} - .+

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

谁能指出我正确的方向?

谢谢 :)

4

2 回答 2

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})
于 2012-08-17T14:47:03.200 回答
1

从您的示例文本文件中看起来可能有一些空行。如果没关系,你应该可以使用这个正则表达式:

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

如果这只是一个错误并且不需要空行,请将 last 替换+*

^(?: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)

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

于 2012-08-17T14:56:24.670 回答