在分隔区域之外查找短语

时间:2016-05-10 20:04:43

标签: regex pcre string-matching string-parsing

我正在编写用于检测事件的日志文件的正则表达式。我要做的是检测日志中是否出现短语"restart-required",但棘手的部分是,我想忽略所有调试消息。不幸的是,日志没有以任何形式被删除,只是一起运行。

好消息是,我的所有调试消息都以'Debug:'开头,以'endmsg'.结尾

到目前为止我能够组合起来的是一个捕获我所有调试短语的正则表达式。

/Debug:\s(.+?(?=endmsg))/gm

我从这里无法弄清楚的是如何扩展它以搜索短语'restart-required'但忽略它,如果它在其中一个捕获的调试消息中。

我正在使用的正则表达式101 - https://regex101.com/r/zI1kM2/3

我不打算捕捉短语或其周围的任何内容,只是一个布尔True / False来回答问题“短语'restart-required'是否出现在某个地方调试消息之外的日志?“

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以使用的一个正则表达式是:Debug.*?endmsg|(restart-required)

这将首先匹配所有Debug语句,如果它不匹配,它将尝试匹配右侧的组(具有捕获组的组)。处理匹配项时,查找是否有任何匹配项具有第一个捕获组。如果他们这样做,那么您可以返回true

Regex101 Example - 匹配以绿色

突出显示

有关此内容的更多信息,请阅读Rexegg的The Best Regex Trick

编辑:关注this answer,我也发现了PCRE内置了类似内容的方式。它与(*SKIP)和{{1}一起使用}(more information here)。修改后的正则表达式将是:

(*F)

它不需要检查任何捕获组,并且具有所需的输出。如果此正则表达式有任何匹配项,请返回Debug.*?endmsg(*SKIP)(*F)|restart-required

Regex101 Example

答案 1 :(得分:1)

不是直接为所需任务编写正则表达式,而是从日志中删除所有调试消息,然后在剩余的日志消息中搜索(使用或不使用正则表达式)字符串'restart-required'

要删除调试消息,请将正则表达式Debug:.*?endmsg的匹配项替换为空字符串''

答案 2 :(得分:0)

尝试一下:

/(?=(^Debug:\s(.+?(?=endmsg))$))|(^.*restart-required.*$)/gm

正如您所说,第一组使用正向前瞻来匹配调试消息,第一组不会包含在结果中,第二组选择包含 restart-required <的剩余行/强>

我通常使用shell命令提供BRE和ERE,因此上面的PCRE正则表达式应该被清理和测试。

网上有一些在线pcre控制台可供使用:例如Online Regex Tester,在页面上使用选择框切换到PCRE。这对于使用日志文件样本测试PCRE正则表达非常有用。

上面的测试仪已用于这些系列:

test line 1
Debug: blablabla with endmsg
test line 2
two words restart-required
Debug: one two three with endmsg