在 Perl 中构建正则表达式可能有点棘手,特别是对于新手而言。这是一种强大的技术,但即使是经验丰富的 Perl 开发人员有时也会发现自己查阅文档以确保他们做对了。
正则表达式的另一个常见问题在于我们一直使用的常用表达式;似乎我们一直在重复发明轮子!但是,至少对于这个问题,有一个有用的答案。
前段时间,我向一位同行开发人员询问了一份最有用的模块列表,而这个模块真正脱颖而出,因为我遇到了它旨在解决的问题。Damian Conway 的模块 Regexp::Common 建立了一个框架,用于拥有可重复使用的、有用的正则表达式。有帮助的是,它附带了大量已定义的例程,并且它提供了用于为你应用程序可能需要的任何内容滚动你自己的模式的工具。让我们快速看一下。
用法
一旦你使用 use Regexp::Common
使用了该模块,你就可以在你放置自己的表达式的地方替换包含的模式,就像这样
if ( $input =~ /$RE{num}{int}/ ){
print 'yes, it is an integer!';
}
elsif ( $input =~ /$RE{quoted}/ ){
print 'it is a quoted string!';
}
如果你更喜欢另一种方式,你也可以使用基于子程序的接口。来自上面的相同逻辑看起来像这样
if ( $input =~ RE_num_int() ){
print 'yes, it is an integer!';
}
elsif ( $input =~ RE_quoted() ){
print 'it is a quoted string!';
}
一些内置表达式具有参数设置,可让你配置其行为,例如搜索分隔符、字符串格式和许多其他内容。要使用它们,只需将它们包含在调用中即可
# Check for balanced parentheses
if ( $input =~ /$RE{balanced}{-parens=>'()'}/ ) {...}
# or using the subroutine interface:
if ( $input =~ RE_balance(-parens=>'()' ) {...}
我发现的一个非常好的模式是调用以删除前导和/或尾随空格。在我编写 Perl 的 15 年左右的时间里,我看到了很多乱七八糟的方法来做到这一点,但对我来说,这非常干净和优雅
$input =~ s/$RE{ws}{crop}//g;
Regexp::Common 已经部署了许多模式,包括多种 URL、常见的字符串格式问题、信用卡号、数字、空格、邮政编码、美国社会安全号码、回文甚至亵渎!我查看了最后一个的源代码,我被难住了;Damian 的正则表达式功夫比我强得多,而这不仅仅是一个简单的列表匹配工具。你可以在 MetaCPAN 上的 Regexp::Common 发布页面 上查看包含模块的完整列表。
创建你自己的
如果你想在 $RE
哈希中创建自己的元素,你可以在你的 use
语句中包含 pattern
导出。这是一个改编自文档的示例
use Regexp::Common 'pattern';
pattern name => ['name', 'mine'],
create => '(?i:Ruthie)',
#the 'i' makes it case-insensitive!
;
my $input = 'Ruthie, I really need you to finish this article!';
if ($input =~ /$RE{name}{mine}/) {
print "You got mentioned!\n";
}
$input = 'I can even, ruthie, include it mid-sentence.';
if ($input =~ /$RE{name}{mine}/) {
print "You got mentioned en passant!\n";
}
如果你的应用程序工作使用正则表达式进行数据验证,请务必查看 Regexp::Common,看看你是否可以节省一些时间和痛苦。通过根据需要向 Regexp::Common 的工具阵列添加新模块,你可以在整个大型应用程序中进行一致的验证。如果你编写了一些有用的东西,为什么不将其提交给维护者添加呢?你可以在 Regexp::Common 文档中找到 联系信息。
2 条评论