s for postal codes.
这些正则表达式是通过hash进行嵌套的,hash的名称为%RE。例如模块Regexp::Common::URI::http,它提供的是HTTP URI的正则表达式,它嵌套了两层,第一层的key为URI,这个key对应的值是第二层hash,第二层hash的key为HTTP,于是可以通过$RE{URI}{HTTP}的方式获取这个正则。
例如,匹配一个http url是否合理:
use Regexp::Common qw(URI);
while( <> ) {
print if /$RE{URI}{HTTP}/;
}
在学习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}/;
}