2014-06-12 24 views
1

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

我可以在2个步骤执行此操作:

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

但我不知道是否有可能做到这一点在一个正则表达式:

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

如何提供一些示例数据?你的$ range1,$ range2和$ ip字符串是什么样的? –

回答

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

0

是的,这是可能的使用模式断言连接两个独立的子表达式到一个单一的正则表达式:

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

但是,如果你真的在处理IP地址,你应该使用像NetAddr::IP这样的模块。

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 
    } 
} 
相关问题