PCRE正则表达式 - 如何返回匹配多行字符串以任意顺序查找多个字符串
我需要使用Perl兼容正则表达式来匹配出现在文件中多行的多个字符串。PCRE正则表达式 - 如何返回匹配多行字符串以任意顺序查找多个字符串
这些匹配需要以任何顺序出现(服务器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
期望
正则表达式应该匹配,并返回3号线与服务器开始(即按任何顺序出现),当且仅当是绝配对于strings'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
以任何顺序出现,并且如果匹配。
非常感谢您的帮助。
关于主要问题[用于二次问题看到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)
这些匹配现在都在a
,z
和d
捕获组中。
这不是最有效率的(它在每一行上都有三次回溯......),但主要的要点是注册与捕获组的匹配,然后检查它们是否被定义。
谢谢你提供这个。我将原始问题的示例文本放入一个文件中,并尝试使用这个正则表达式,但它没有返回命中。 grep -P'(?:(?。* serverA \ .company \ .com \ s + iburst。*)|(?
@KurtW'grep -P'的问题是它匹配每行_individually_。你不能用'grep -P'来匹配任何跨越多行的东西。您需要将PCRE提供给整个文件。 (引用grep的手册页:“从FILE获取模式,**每行**一个。”) – bwoebi
谢谢,这有帮助。我已将此标记为接受的答案。感谢你的时间! –
你并不需要使用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
嗨Casimir!这实际上是我回答你的第二个问题。谢谢你,这是有帮助的,但你有办法解决主要问题(多线)?对不起,如果我让事情比必要的更混乱。单线正则表达式是一个奖金,我现在正在测试它! –
嗨Casimir,我证实你的解决方案,单线问题完美的作品!谢谢。当你有机会时,你能看看我的主要问题吗?将二者合二为一的道歉 - 我将来不会那样做。 –
Upvoted,因为这是有帮助的。 bwoebi解决了我的主要问题。感谢您的时间! –
你是在谈论PCRE还是关于Perl程序? – simbabque
感谢您的快速反应,并看着这个。 PCRE具体。我将使用'grep -P'命令。请刷新,因为我添加了一个新的关于预先输出的正则表达式,这是我之前忽略的。 –
然后请不要用Perl标记。我将删除标签。有一个完整的程序解决这个问题,但在一个正则表达式中这样做会很困难。 – simbabque