使用 Regexp::Common 在 Perl 中轻松进行数据验证

使用 Regexp::Common 模块,简化在 Perl 中构建正则表达式的复杂性。
327 位读者喜欢这篇文章。
hands programming

WOCinTech Chat。由 Opensource.com 修改。CC BY-SA 4.0

在 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 文档中找到联系信息。

标签
User profile image.
Ruth Holloway 长期以来一直担任系统管理员和软件开发人员,早在很久以前就在 VAX 11/780 上开始了她的职业生涯。 她职业生涯的大部分时间(到目前为止)都在为图书馆的技术需求服务,并且自 2008 年以来一直是 Koha 开源图书馆自动化套件的贡献者。 Ruth 目前是 Clearbuilt 的 Perl 开发人员和项目负责人。

2 条评论

很高兴知道,Ruth。
我正在尝试弄清楚你的最后一个示例如何知道吃过路兵的引用与其他引用不同...正则表达式看起来相同。

在最后的代码块中,正则表达式对于两种用法都是相同的,因此无法区分句子中间和句子开头的引用(或者,就此而言,大小写差异)。 如果你想这样做,你可以轻松地为这种行为创建正则表达式模式,然后使用 Regexp::Common 模式来指代两种不同的行为。 Regexp::Common 只是你打算多次使用的正则表达式的一种更易读的快捷方式。

回复 作者 Greg P

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.