Perl IP地址范围的正则表达式

时间:2010-12-16 13:37:40

标签: regex perl ip-address

我有一些互联网流量数据需要分析。我只需要分析某个IP范围内的数据包。所以,我需要写一个if语句。我想我需要一个正则表达式来测试条件。我对regexp的了解有点弱。有人能告诉我如何构建该条件的正则表达式。示例范围可能类似于

Group A
56.286.75.0/19 
57.256.106.0/21 
64.131.14.0/22 

Group B
58.176.44.0/21 
58.177.92.0/19 

if语句就像

if("IP in A" || "IP in B") {
        do something
}

else { do something else }

所以我需要为“A中的IP”和“B中的IP”条件制作等效的正则表达式。

4 个答案:

答案 0 :(得分:8)

我不认为正则表达式为这个问题提供了很多优势。

而是使用Net :: Netmask模块。 “匹配”方法应该做你想要的。

答案 1 :(得分:1)

我必须回应使用正则表达式来检查IP地址的不同意见......但是,这是一种从文本中提取IP的方法:

qr{
  (?<!\d)             # No digit having come immediately before
  (?: [1-9] \d?       # any one or two-digit number
  |   1 \d \d         # OR any three-digit number starting with 1
  |   2 (?: [0-4] \d  # OR 200 - 249
        |   5 [0-6]   # OR 250 - 256
        )
  )
  (?: \.                 # followed by a dot
      (?: [1-9] \d?      # 1-256 reprise...
      |   1 \d \d 
      |   2 (?: [0-4 \d
            |   5 [0-6]
            )
      )
  ){3}     # that group exactly 3 times
  (?!\d)   # no digit following immediately after         
}x
;

但鉴于一般模式,我们可以构建一个IP解析器。但是对于给定的“范围”,我不会做以下任何事情:

A => qr{
  (?<! \d )
  (?: 56\.186\. 75
  |   57\.256\.106
  |   64\.131\. 14
  )
  \.
  (?: [1-9] \d?
  |   1 \d \d
  |   2 (?: [0-4] \d
        |   5 [0-6]
        )
  )
  (?! \d )
  }x

B => qr{
  (?<! \d )
  58 \.
  (?: 176\.44
  |   177\.92
  )
  \.
  (?: [1-9] \d?
  |   1 \d \d
  |   2 (?: [0-4] \d
        |   5 [0-6]
        )
  )
  (?! \d )
  }x

答案 2 :(得分:1)

我正在做类似的事情:

use NetAddr::IP;

my @group_a = map NetAddr::IP->new($_), @group_a_masks;
...
my $addr = NetAddr::IP->new( $ip_addr_in );
if ( grep $_->contains( $addr ), @group_a ) {
    print "group a";
}

我选择NetAddr :: IP over Net :: Netmask支持IPv6。

答案 3 :(得分:0)

马丁是对的,使用Net :: Netmask。如果你真的想使用正则表达式......

$prefix = "192.168.1.0/25";
$ip1 = "192.168.1.1";
$ip2 = "192.168.1.129";

$prefix =~ s/([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\/([0-9]+)/$mask=(2**32-1)<<(32-$5); $1<<24|$2<<16|$3<<8|$4/e;
$ip1 =~ s/([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/$1<<24|$2<<16|$3<<8|$4/e;
$ip2 =~ s/([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/$1<<24|$2<<16|$3<<8|$4/e;

if (($prefix & $mask) == ($ip1 & $mask)) {
  print "ip1 matches\n";
}
if (($prefix & $mask) == ($ip2 & $mask)) {
  print "ip2 matches\n";
}