2

我使用此代码来匹配 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 循环。有没有办法只在正则表达式中进行检查(< 256)

我知道还有另一种方式

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

有没有别的捷径

4

5 回答 5

9
use Regexp::Common 'net';

if ( $IP =~ /\A$RE{net}{IPv4}\z/ ) {
    print "IP matched\n";
}
于 2013-11-11T06:16:36.353 回答
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";
}
于 2013-11-11T06:36:29.210 回答
1

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

于 2013-11-11T05:57:10.930 回答
1

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

于 2013-11-11T05:57:27.637 回答
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指最后关闭的捕获组。请注意,在正则表达式中评估代码具有安全影响1,并且该技术不能移植到其他正则表达式引擎,如 pcre。


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

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

    Perl 通过要求您use re qw/eval/自己负责 regex 安全性,将您从 regex 安全地狱中拯救出来。请注意,仅当插值触发新编译时才需要这样做:my $ok = qr/(?{ say "yes" })/; $foo =~ /$ok/工作得很好。

于 2013-11-11T19:36:34.617 回答