如果某个单词不存在,请尝试匹配。我以前做过这个,但是在尝试将相同的概念应用到我当前的regex
模式时遇到了问题。以下模式来自cisco开关,它使用"!"作为接口之间的分隔符。如果vlan1
存在并且包含" no shutdown"则模式匹配在其多行配置块中。
(?mi)vlan1[^\d][^!]*?((^.|^)no shutdown)
问题是当接口vlan1
config
块没有字符串" shutdown"时,我也试图匹配。这是必需的,因为" no shutdown"没有"关机" (没有" no")表示接口vlan1已启用。
例如,我期待类似于以下模式的东西,这不起作用:
(?mi)vlan1[^\d][^!]*?(^.|^)(no shutdown|(?!shutdown))
如果"没有关闭"结果应该匹配。或没有"关闭"存在。
见这里的工作: https://regex101.com/r/vhE3xm/1
答案 0 :(得分:1)
我建议使用相反的逻辑:检查Vlan1接口是否已正确关闭:
(Vlan\d+)(?:(\n(\s(\[\w-=<>\])+)+)+)(?=\n\sshutdown)
$ 1包含Vlan1。
答案 1 :(得分:0)
我想通了,非常感谢@WiktorStribiżew的帮助。这是我用过的东西
(?mi).*vlan1[^\d](?:(?!(.|\n)[^!]*(?<!no\W)shutdown))
如果“vlan1”存在并且它的脚本块中不包含“shutdown”(两个'!'符号之间),则它将仅匹配。我知道这将是一个相当简单的解决方案。你有什么方法可以优化它?目前需要一段时间才能完成。 regex101.com/r/gYTP6n/1
注意:您必须删除“关闭”一词。或其中的任何信件。我的目标是不匹配,因为我的审核中的匹配将失败