使用 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=>'()' ) {...}

我发现的一个非常好的模式是调用以删除前导和/或尾随空格。在我编写 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 文档中找到 联系信息

标签
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.