在perl中匹配IP

时间:2013-11-11 05:52:38

标签: regex perl

我使用此代码来匹配IP

$IP =~ /(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/;

if ( $1 < 256 && $2 < 256 && $3 < 256 && $4 < 256) {
print "IP matched";
}

我不想使用if循环。有没有办法可以在regexp中进行检查(&lt; 256)

我知道还有另一种方式,如

/25[0-5]|2[0-4][0-9]|[01][0-9][0-9]?/

还有另一种快捷方式

5 个答案:

答案 0 :(得分:9)

use Regexp::Common 'net';

if ( $IP =~ /\A$RE{net}{IPv4}\z/ ) {
    print "IP matched\n";
}

答案 1 :(得分:2)

查看@ysth的答案,或者你可以将匹配存储到数组中:

my @m = grep $_ <256, $IP =~ /([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/;

if (@m == 4) {
  print "IP matched";
}

答案 2 :(得分:1)

这不是很漂亮,但是怎么样 /^(1?\d{1,2}|2[0-4]\d|25[0-5])(\.(1?\d{1,2}|2[0-4]\d|25[0-5])){3}$/

答案 3 :(得分:1)

我能理解你在询问有关验证IP地址的正则表达式吗?但为什么不尝试http://metacpan.org/pod/Data::Validate::IP而不是手动方法?

答案 4 :(得分:0)

嵌入式代码可以用作正则表达式中的条件,并且可以使某些分支强制回溯:

qr/
  # the string consists of nothing but 4 bytes separated by a period
  \A (?&decimal_byte) (?: [.] (?&decimal_byte) ){3} \z

  (?(DEFINE)
    (?<decimal_byte>
      ([0-9]{1,3}+)  # 1 to 3 digits without backtracking
      (?(?{ $^N <= 0xFF }) | (*FAIL) )  # (?(?{ COND }) YES | NO )
    )
  )
/x

$^N是指last closed capture group。请注意,评估正则表达式中的代码具有安全性影响 1 ,并且此技术无法移植到其他正则表达式引擎(如pcre)。


  1. 如果您盲目地插入不受信任的正则表达式,它可以执行任意代码:

    my $malicious = '(?{ `rm -rf ~` })';
    
    say "You were pwned" if $foo =~ /something="$malicious"/;
    

    如果你想自己负责正则表达式安全,Perl会要求你use re qw/eval/,从而使你免于正则表达式安全地狱。请注意,只有在插值触发新编译时才需要这样做:my $ok = qr/(?{ say "yes" })/; $foo =~ /$ok/工作正常。