首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在正则表达式中找到匹配字符(包括换行符),直到下一次匹配

在正则表达式中找到匹配字符(包括换行符),直到下一次匹配
EN

Stack Overflow用户
提问于 2012-08-17 14:07:54
回答 2查看 132关注 0票数 0

我正在尝试使用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

我使用以下正则表达式:

代码语言:javascript
复制
.{5} \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} - .+

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

谁能给我指明正确的方向?

谢谢:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-17 14:47:03

基本上,这个解决方案背后的想法是告诉您的正则表达式不是包含什么,而是停止在哪里。

此正则表达式使用正的前瞻性,在正则表达式的下一次出现时(或在整个字符串的末尾)不贪婪地停止。

代码语言:javascript
复制
.{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。

代码语言:javascript
复制
.{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
EN

Stack Overflow用户

发布于 2012-08-17 14:56:24

从您的示例文本文件看,可能有一些空行。如果可以的话,您应该可以使用这个regex:

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

如果这只是一个错误,并且不需要空行,那么用*替换最后一个*

代码语言:javascript
复制
^(?: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中没有匹配组,所以我使用了(?:...)非匹配变量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12007398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档