2014-06-12 25 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 
    } 
} 
相關問題