在 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=>'()' ) {...}
我发现的一个非常好的模式是调用删除前导和/或尾随空格。 在大约 15 年的 Perl 编写生涯中,我见过很多种混乱的方式来做到这一点,但对我而言,这种方式非常干净和优雅
$input =~ s/$RE{ws}{crop}//g;
Regexp::Common 已经部署了许多模式,包括各种 URL、常见的字符串格式问题、信用卡号、数字、空格、邮政编码、美国社会安全号码、回文,甚至亵渎性语言! 我查看了最后一个的源代码,我被难住了; Damian 的正则表达式技巧比我的强得多,而且这不仅仅是一个简单的列表匹配工具。 你可以在 MetaCPAN 上的 Regexp::Common 发布页面上看到包含模块的完整列表。
创建你自己的
如果你想在 $RE
哈希中创建自己的元素,你可以在你的 use
语句中包含 pattern
export。 这是一个从文档中改编的示例
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 条评论