PCRE Regex - 如何使用多行字符串返回匹配,以任意顺序查找多个字符串

时间:2016-11-03 21:38:47

标签: pcre multiline lookahead negative-lookahead

我需要使用Perl兼容的正则表达式来匹配文件中多行出现的多个字符串。

匹配需要以任何顺序出现(服务器servernameA.company.com后跟servernameZ.company.com,后跟servernameD.company.com或三者的任何订单组合)。 注意:所有匹配项都会显示在每行的开头。

在我使用grep -P的测试中,我甚至无法在新行上以任何顺序显示的简单字符串术语上产生匹配(即使使用/s和{{1修饰符)。我非常肯定从阅读中我需要一个前瞻性断言但是我使用的样本即使在分析了正则表达式的每一位之后也没有为我产生匹配,以确保它与我的场景相关。

由于我需要在制作中支持这一点,我想要一个简单且相对简单易懂的答案。

示例输入

/m

期望

正则表达式应匹配并返回以服务器开头的3行(以任何顺序出现)当且仅当字符串'serverA.company.com','serverZ.company.com'完全匹配时, 'serverD.company.com'接着是iburst。必须包含所有3个字符串。

最后,如果答案(或答案的一个非常相似的形式)可以解决在行上以任何顺序检查字符串的问题,那将非常有帮助。例如,如果我有一个单行字符串:irrelevant_directive = 0 # Comment server servernameA.company.com iburst additional_directive = yes server servernameZ.company.com iburst server servernameD.company.com iburst # Additional Comment final_directive = true ,我想确保条款preauth param audit=true silent deny=5 severe=false unlock_time=1000 time=20msdeny=5以任何顺序出现,如果匹配的话。

提前感谢您的协助。

2 个答案:

答案 0 :(得分:1)

您不需要使用PCRE功能,只需在ERE中写入:

grep -E '.*(\bdeny=5\b.*\btime=20ms\b|\btime=20ms\b.*\bdeny=5\b).*' file

PCRE方法将有所不同:(但您也可以使用以前的模式)

grep -P '^(?=.*\bdeny=5\b).*\btime=20ms\b.*' file

答案 1 :(得分:1)

关于主要问题[针对次要问题,请参阅Casimir et Hippolyte answer](使用x修饰符):https://regex101.com/r/mkxcap/5

(?:
  (?<a>.*serverA\.company\.com\s+iburst.*)
 |(?<z>.*serverZ\.company\.com\s+iburst.*)
 |(?<d>.*serverD\.company\.com\s+iburst.*)
 |[^\n]*(?:\n|$)
)++
(?(a)(?(z)(?(d)(*ACCEPT))))(*SKIP)(*F)

现在所有匹配都在azd捕获组中。

它不是最有效的(它在每一行上都有三次回溯...),但主要的内容是将匹配注册到捕获组,然后检查它们是否被定义。