正则表达式,用于检查是否在2个范围内找到IP

时间:2014-06-12 07:55:59

标签: python regex perl

是否可以将正则表达式编写为一个表达式来检查是否在2个范围内找到了IP?

我可以分两步完成:

if ($ip =~ /$range1/ and $ip =~ /$range2/ ) {
    print "intersection"
}

但我想知道是否可以在一个正则表达式中执行此操作:

if ($ip =~ /$my_regex/ ) {
    print "intersection";
}

3 个答案:

答案 0 :(得分:3)

您可以使用模块NetAddr::IP

use strict;
use warnings;
use NetAddr::IP;

my @addresses = (
    NetAddr::IP->new('192.168.172.1/255.255.0.0'),
    NetAddr::IP->new('10.1.0.0/255.0.0.0'),
);

my $address_to_check = NetAddr::IP->new($IP_TO_CHECK);

foreach my $address_in_list (@addresses) {
  if ($address_to_check->within $address_in_list) {
    # do something
  }
}

答案 1 :(得分:2)

以下是Perl的解决方案。

为什么不使用NetAddr::IP让它处理呢?例如

#!/usr/bin/perl
use strict;
use warnings;
use NetAddr::IP;
my @addresses = (
    new NetAddr::IP '216.239.32.0/255.255.32.0',
    new NetAddr::IP '64.157.227.255/255.255.252.0'
);
my $banned = 0;
my $visitor_address = NetAddr::IP->new($visitor_ip);
foreach my $banned_address (@addresses) {
    if ($visitor_address->within $banned_address) {
       $banned = 1;
       last;
    }
}

阅读文档和可用方法:https://metacpan.org/pod/NetAddr::IP

答案 2 :(得分:0)

是的,可以使用先行断言将两个独立的子表达式连接到一个正则表达式中:

if ($ip =~ /^(?=.*$range1)(?=.*$range2)/s ) {
    print "intersection"
}

但是,如果您真的在处理IP地址,则应使用NetAddr::IP之类的模块。