PCRE 正则表达式 - 如何 return 匹配多行字符串以任意顺序查找多个字符串

PCRE Regex - How to return matches with multiline string looking for multiple strings in any order

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

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

在我使用 grep -P 进行的测试中,我什至无法对以任何顺序出现在新行上的简单字符串术语进行匹配(即使使用 /s/m修饰符)。从阅读中我很确定我需要一个前瞻性断言,但即使在分析了正则表达式的每一位以确保它与我的场景相关之后,我使用的示例也没有为我生成匹配项。

由于我需要在生产中支持这一点,所以我想要一个简单且相对直接解释的答案。

示例输入

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

预期

当且仅当字符串'serverA.company.com', 'serverZ.company.com','serverD.company.com' 后跟 iburst。必须包括所有 3 个字符串。

最后,如果答案(或非常相似的答案形式)可以解决在 单行 行上以任何顺序检查字符串,那将非常有帮助。例如,如果我有一个单行字符串:preauth param audit=true silent deny=5 severe=false unlock_time=1000 time=20ms 并且我想确保术语 deny=5time=20ms 以任何顺序出现并且匹配。

预先感谢您的帮助。

不需要使用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

关于主要问题[次要问题见] (using x modifier): 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 捕获组中。

它不是最有效的(它通过回溯遍历每行 3 次...),但主要的收获是用捕获组注册匹配项,然后检查它们是否被定义。