perl-regexp
在Perl中构建正则表达式可能会有些棘手,特别是对于新手而言。 这是一项强大的技术,但是即使是经验丰富的Perl开发人员有时也会发现自己在检查文档以确保他们做对了。
正则表达式的另一个常见问题在于我们一直使用的通用表达式。 似乎我们将永远重新发明轮子! 但是,至少对于这个问题,有一个有用的答案。
Damian Conway的模块Regexp :: Common为具有可重复的,有用的正则表达式建立了框架。 有用的是,它附带了许多已定义的例程,并且它提供了一些工具,可用于为应用程序可能需要的任何内容汇总自己的模式。 让我们快速看一下。用法
将模块与use Regexp::Common
一起use Regexp::Common
,可以在要放置自己的表达式的地方替换包含的模式,如下所示:
如果您喜欢以其他方式使用它,则也可以使用基于子例程的界面。 上面的逻辑相同,如下所示:
一些内置表达式具有参数设置,可让您配置其行为,例如搜索分隔符,字符串格式以及许多其他内容。 要使用它们,只需将它们包括在通话中:
# 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的正则表达式fu比我的强得多,这不仅是一个简单的列表匹配工具。 您可以在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文档中找到联系信息 。
翻译自: https://opensource.com/article/18/3/easy-data-validation-regexpcommon
perl-regexp