在学习shell脚本的时候,经常有人写匹配IPV4的正则表达式,现在我们可用直接从Regexp::Common::net中获取:
use Regexp::Common qw(net);
$ipv4=$RE{net}{IPv4};
print $ipv4;
以下是结果:
(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))
只是需要注意的是,在真正匹配的时候应该将得到的引用锚定起来,否则对318.99.183.11进行匹配的时候也会返回true,因为18.99.183.11是符合匹配结果的。所以,对前后都加上锚定,例如:
$ipv4 =~ /^$RE{net}{IPv4}$/;
将上面的ipv4正则改造一下(去掉非捕获分组的功能),让它适用于shell工具中普遍支持的扩展正则:
(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})){3}
默认情况下,Regexp::Common的各个模块是没有开启捕获功能的。如果要使用$1、$N这种引用,需要使用{-keep}选项,至于每个分组捕获的是什么内容,需要参考帮助文档的说明。
例如:
use Regexp::Common qw(number);
while( <> ) {
say $1 if /$RE{num}{int}{ −base => 16 }{−keep}/;
}
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx