很抱歉提出这样一个简单的问题,我仍然是一个没有经验的程序员。我在工作中的一些旧Perl代码中偶然发现了一个电话号码匹配的正则表达式,如果有人可以确切解释它的含义(我的正则表达式技能严重不足),我会喜欢上它。
if ($value !~ /^\+[[:space:]]*[0-9][0-9.[:space:]-]*(\([0-9.[:space:]-]*[0-9][0-9.[:space:]-]*\))?([0-9.[:space:]-]*[0-9][0-9.[:space:]-]*)?([[:space:]]+ext.[0-9.[:space:]-]*[0-9][0-9.[:space:]-]*)?$/i) {
...
}
先感谢您 :)
代码大致上说:“您应该将其替换为Number :: Phone ”。
除了开玩笑和好的建议,弄清楚正则表达式时要做的第一件事就是用扩展它/x
。第一步是按捕获组将事情分解。
/^
\+[[:space:]]*[0-9][0-9.[:space:]-]*
(\([0-9.[:space:]-]*[0-9][0-9.[:space:]-]*\))?
([0-9.[:space:]-]*[0-9][0-9.[:space:]-]*)?
([[:space:]]+ext.[0-9.[:space:]-]*[0-9][0-9.[:space:]-]*)?
$/xi
然后,由于这是由字符集控制的,因此我将按字符集隔开。
/^
\+ [[:space:]]* [0-9] [0-9.[:space:]-]*
( \( [0-9.[:space:]-]* [0-9] [0-9.[:space:]-]* \) )?
( [0-9.[:space:]-]* [0-9] [0-9.[:space:]-]* )?
( [[:space:]]+ ext . [0-9.[:space:]-]* [0-9] [0-9.[:space:]-]* )?
$/xi
现在您可以开始看到一些类似的元素。尝试将它们排列在一起以查看相似之处。
/^
\+ [[:space:]]* [0-9] [0-9.[:space:]-]*
( \( [0-9.[:space:]-]* [0-9] [0-9.[:space:]-]* \) )?
( [0-9.[:space:]-]* [0-9] [0-9.[:space:]-]* )?
( [[:space:]]+
ext .
[0-9.[:space:]-]* [0-9] [0-9.[:space:]-]*
)?
$/xi
然后将一个元素归零,然后尝试找出它。这是重要的,[0-9.[:space:]-]*
意思是“零个或多个数字,空格,破折号或点”。这对于电话解析没有多大意义,也许在上下文中会更有意义。让我们看一下可以猜出它在试图做什么的一行。
( \( [0-9.[:space:]-]* [0-9] [0-9.[:space:]-]* \) )?
家长认为这是在尝试解析区号。其余的将其限制为任意数量的数字,空格,破折号或点,但是请[0-9]
确保至少有一个数字。这可能是作者处理多种电话号码格式的方式。
让我们给它起一个名字叫它phone_chars
,因为这是作者决定电话号码的来源。还有另一个元素,[0-9.[:space:]-]* [0-9] [0-9.[:space:]-]*
我称之为“电话原子”,因为这是作者决定电话号码的原子可以是什么。如果我们将其放在自己的正则表达式中,并使用它构建电话正则表达式,事情就会变得更加清晰。
my $phone_chars = qr{[0-9.[:space:]-]};
my $phone_atom = qr{$phone_chars* [0-9] $phone_chars*}x;
/^
\+ [[:space:]]* [0-9] $phone_chars*
( \( $phone_atom \) )?
( $phone_atom )?
( [[:space:]]+ ext . $phone_atom )?
$/xi;
如果您对电话号码有所了解,就可以这样:
此正则表达式在验证电话号码方面做得不好。根据此正则表达式,“ + 1”是有效的电话号码,但“(555)123-4567”不是有效的电话号码,因为它没有国家/地区代码。
电话号码验证很难。我是否提到过Number :: Phone?
use strict;
use warnings;
use v5.10;
use Number::Phone;
my $number = Number::Phone->new("+1(555)456-2398");
say $number->is_valid;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句