2017-10-12 39 views
1

尝试匹配,如果一个字不存在。我之前已经完成了这项工作,但是在试图将相同的概念应用到我目前的regex模式中时遇到问题。以下模式来自Cisco交换机,它使用“!”作为界面之间的分隔符。如果存在vlan1并且在其多行配置块中包含“no shutdown”,则该模式匹配。正则表达式匹配如果字符串不存在(多行)

(?mi)vlan1[^\d][^!]*?((^.|^)no shutdown) 

的问题是,我想也匹配时,接口vlan1config块没有字符串“关机”。这是必需的,因为“no shutdown”和“shutdown”(不带“no”)都表示接口vlan1已启用。

例如,我期待类似下面的图案,这是不行的东西:

(?mi)vlan1[^\d][^!]*?(^.|^)(no shutdown|(?!shutdown)) 

结果应符合仅在某个“不关机”或没有“关闭”的存在。

看到这里的工作: https://regex101.com/r/vhE3xm/1

+1

正则表达式小提琴中的预期匹配是什么? –

+1

尝试['(?mi)。* vlan1(?:\ R(?! * shutdown | interface Vlan)。*)*'](https://regex101.com/r/Qr8kJS/2)。 –

+0

不要在一种模式下执行此操作,提取块,使用“vlan1”上的测试和“关闭”上的测试对它们进行过滤。 –

回答

0

我想通了,非常感谢@WiktorStribiżew的帮助。这里是我用

(?mi).*vlan1[^\d](?:(?!(.|\n)[^!]*(?<!no\W)shutdown)) 

这将只匹配,如果“VLAN1”的存在,并没有包含在脚本块“关机”(两者之间的“!”符号)。我知道这将是一个相当简单的解决方案。你可以优化它的任何方式?目前需要一段时间才能完成。 regex101.com/r/gYTP6n/1

注意:您必须删除单词“关机”。或其中的任何字母。我的目标是不匹配,因为匹配在我的审计中将失败

1

我建议使用相反的逻辑:检查VLAN1接口已经正常关机:

(Vlan\d+)(?:(\n(\s(\[\w-=<>\])+)+)+)(?=\n\sshutdown)

$ 1包含Vlan1的,如果关机是在发现下面的块。

+1

这是一种有效的模式,除了在我的思科路由器上不存在Vlan1之外,它们都能正常工作,所以它们都会使审计失败。似乎只是将交换机和路由器分开审计。 – livy111

+0

理想情况下,如果我们逆转逻辑,目标将变为采用两种匹配模式,并合并为一:1.(与配置块同时包含“vlan1”和“关闭”时匹配的正则表达式模式)或2.(正则表达式模式当没有行包含“vlan1”时匹配)。 – livy111

相关问题