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=5
和 time=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)
比赛现在都在 a
、z
和 d
捕获组中。
它不是最有效的(它通过回溯遍历每行 3 次...),但主要的收获是用捕获组注册匹配项,然后检查它们是否被定义。
我需要使用与 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=5
和 time=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
关于主要问题[次要问题见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)
比赛现在都在 a
、z
和 d
捕获组中。
它不是最有效的(它通过回溯遍历每行 3 次...),但主要的收获是用捕获组注册匹配项,然后检查它们是否被定义。