我可以优化这个perl正则表达式吗?

时间:2014-08-19 22:38:58

标签: regex perl

我正在尝试匹配一些ip名称(点分十进制或名称)。我需要匹配以下任何一项:

hostname-1-2-3
hostname-1-2-3.here.somewhere.com
hostname-1-2-3.here or
192.168.1.2
hostname-1-2.*

我有这个if语句:

if ($name !~ m/^[a-zA-Z0-9-\.]+$/ and 
    not $name =~ m/^[a-zA-Z0-9-]\.\*/ and 
    not $name =~ m/^[0-0]+\.[0-9]+\.[0-9]+\.[0-9]+$/)
{
    print "inside if\n";
}
else {
    print "inside else\n";
}

它现在打印在其他内部'对于前4个名字,以及'内部如果'为姓氏(该名称将在代码中扩展为多个主机名。

这是我想要的行为,我只是想知道我的正则表达式是否可以合并,因为前两个匹配非常相似。

1 个答案:

答案 0 :(得分:1)

你在这里做了太多的否定......这样的阅读并不容易。

以下是您的解决方案:

^(?:
    (?:\d+\.){3}\d+
    |
    [a-zA-Z][-a-zA-Z0-9.]*
)$

Demo

此正则表达式将匹配:

  • 表单的IP地址##。##。##。##(4个数字,不少,不多)
  • 以字母
  • 开头的地址(字母,数字,短划线和点)

我认为这应该满足相同的要求。