如果字符串不存在,则使用正则表达式匹配(多行)

时间:2017-10-12 20:27:51

标签: regex

如果某个单词不存在,请尝试匹配。我以前做过这个,但是在尝试将相同的概念应用到我当前的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

2 个答案:

答案 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

注意:您必须删除“关闭”一词。或其中的任何信件。我的目标是不匹配,因为我的审核中的匹配将失败