负面的前瞻表达

时间:2014-03-10 23:13:25

标签: regex perl regex-lookarounds

我正在编写一个Perl脚本,它根据与FQDN匹配的模式在主机上执行不同的操作。我一直在努力寻找能够跳过域名中包含字符串'test'的主机的正则表达式。

这些主机名代表我正在处理的四种主机名:

  • node01.prod.com
  • node01.test.com
  • node02.dmz.prod.com
  • node02.dmz.test.com

以下表达式匹配我试图跳过的主机名模式:

/\w\.test/

但是,我尝试的任何负面前瞻表达式都不会跳过带有'test'的主机名。例如,这个表达式:

/\w\.(?!test)/

匹配/传递所有四种主机名类型,包括包含字符串'test'的两种主机名。

让我疯狂的是,如果我硬编码主机名的一部分,那么负面预测表达式会跳过完整的主机名:

/node01\.(?!test)/    # only matches node01.prod.com

我肯定错过了一些非常明显的东西 - 有什么建议吗?

4 个答案:

答案 0 :(得分:2)

问题在于你在匹配后放置负面预测,这使得它可以匹配部分节点名称,即使它在某处

此表达式将匹配任何不包含test的字符串:

(?!.*test)^.*$

在线演示:

  

http://regex101.com/r/rZ0vO2

答案 1 :(得分:1)

您可以使用此正则表达式:

/\w\.(?!test).+/

你的负向前瞻是正确的但是你的正则表达式在点之后并没有真正匹配。

答案 2 :(得分:0)

以下内容应该这样做:

/(?:\w+\.(?!test))+\w+/

根据您使用正则表达式的方式,您可能还需要一些锚点来阻止test之后的匹配:

/^(?:\w+\.(?!test))+\w+$/

这可以通过将反向预测放在重复组中,以便在正则表达式中匹配的每个.之后进行检查。

例如:http://rubular.com/r/TeUYi9EIEL

答案 3 :(得分:0)

你尝试过这种模式吗?

/(?!.*\.test\.)^.+/