在定界区域外查找短语

Finding phrase outside a delimited region

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

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

结尾

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

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

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

我正在使用的 regex101 - https://regex101.com/r/zI1kM2/3

我不想捕捉短语或任何相关的东西,而只是一个布尔值 True/False 来回答问题 "Does the phrase 'restart-required' occur somewhere in the logs outside of debug messages?"

谢谢!

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

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

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

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

Regex101 Example - 匹配项以绿色突出显示

有关这方面的更多信息,请阅读来自 Rexegg 的 The Best Regex Trick


编辑:正在查看 this answer, I also came across a way in which PCRE has something like this already built in. It is with (*SKIP) and (*F) (more information here)。修改后的正则表达式为:

Debug.*?endmsg(*SKIP)(*F)|restart-required

它不需要检查任何捕获组,并且具有所需的输出。如果此正则表达式有任何匹配项,return true.

Regex101 Example

试一试:

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

如您所述,第一组使用正向前瞻来匹配调试消息,并且第一组不会包含在结果中,第二组 select 剩余行包含 需要重启.

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

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

上面的测试仪使用了这些线路:

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