Regex 在分隔区域外查找短语

Regex 在分隔区域外查找短语,regex,pcre,string-matching,string-parsing,Regex,Pcre,String Matching,String Parsing,我正在为日志文件编写正则表达式以检测事件。我试图做的是检测日志中是否出现短语“restart required”,但棘手的是,我想忽略所有调试消息。不幸的是,日志没有以任何形式被删除,只是一起运行 好消息是,我所有的调试消息都以'debug:'开头,以'endmsg'结尾。 到目前为止,我能够组合的是一个正则表达式来捕获我所有的调试短语 /Debug:\s(.+?(?=endmsg))/gm 从这里我无法理解的是如何扩展它来搜索短语“restart-required”,但如果它在捕获的调试消息

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

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

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

/Debug:\s(.+?(?=endmsg))/gm
从这里我无法理解的是如何扩展它来搜索短语
“restart-required”
,但如果它在捕获的调试消息中,请忽略它

我正在使用的regex101

我不想捕获短语或其周围的任何内容,而只是用布尔值
True
/
False
来回答问题“短语
'restart-required'
是否出现在调试消息之外的日志中?”


谢谢

您可以从日志中删除所有调试消息,然后(使用或不使用regex)在其余日志消息中搜索字符串
“restart-required”
,而不是直接为所需的任务编写regex


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

可以使用的一个正则表达式是:
debug.*.endmsg |(需要重新启动)

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

-匹配项以绿色突出显示

有关这方面的更多信息,请阅读Rexegg


编辑:我还发现了一种方法,即PCRE已经内置了类似的功能。它与
(*SKIP)
(*F)
()一起使用。修改后的正则表达式为:

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

试试看:

/(?=(^Debug:\s(.+?(?=endmsg))$))|(^.*restart-required.*$)/gm
如前所述,第一组使用正向前瞻来匹配调试消息,第一组不包括在结果中,第二组选择包含需要重新启动的剩余行

我通常在shell命令中使用BRE和ERE,因此应该清理和测试上面的PCRE regex

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

上述测试仪已用于以下线路:

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

或者删除所有调试语句,而不是所有包含
需要重新启动的语句。那会更快。@4castle是的,你说得对!谢谢你的建议!我根本没法让它工作。你能给出一个有效的正则表达式吗?@4castle我在回答中提到的pcre正则表达式的测试网站上测试了它。你测试过当前版本吗?在最初的几分钟里,我修改了3次。我需要更多的时间来使用pcre库并测试类似于真实情况的东西。答案已经更新,使用了日志文件摘要。我想你可能错过了问题的一部分,即“日志没有以任何形式删除,只是一起运行”。这是一个很好的答案,但日志中没有任何换行符。试着将它与他们在问题中提供的regex101一起使用。没错,我错过了。我应该说,从PCRE开始是很困难的。我需要更多的时间。可能是@AnmolSinghJaggi的复制品是的,我强烈推荐阅读这篇文章。这个技巧也是公认的答案。我对我的答案进行了更新,使正则表达式更易于使用。它使用了特定于PHP和PCRE的特性!我以前从未见过这些,但它们做得很好。非常感谢。