我有一些互联网流量数据需要分析。我只需要分析某个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”条件制作等效的正则表达式。
答案 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";
}