[英]Matching characters (inc. newlines) in a regex until next match is found
我正在尝试使用正则表达式解析日志文件,问题是我打开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
INFO 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} - .+
这会正确匹配每一行,但不包括已运行到新行的消息部分。 但是当我打开单线模式时,只有一个匹配(第一个),所有其他条目都包含在其中。
谁能指出我正确的方向?
谢谢 :)
基本上这个解决方案背后的想法是告诉你的正则表达式不是要包括什么但是停止在哪里 。
这个正则表达式使用正向前瞻来在你的正则表达式的下一次出现时(或在整个字符串的末尾)非常地停止
.{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})
从您的示例文本文件看起来可能有一些空行。 如果没关系,你应该可以使用这个正则表达式:
^(?: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)
由于你的正则表达式中没有匹配的组,我使用了(?:...)
非匹配变体。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.