加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl电话号码正则表达式

发布时间:2020-12-15 23:27:26 所属栏目:大数据 来源:网络整理
导读:很抱歉问这么简单的问题,我还是一个没有经验的程序员.我在工作中遇到了一些旧的perl代码中的电话号码匹配正则表达式,如果有人能够准确解释它的含义(我的正则表达式技能严重缺乏),我会很高兴. if ($value !~ /^+[[:space:]]*[0-9][0-9.[:space:]-]*(([0-9.[
很抱歉问这么简单的问题,我还是一个没有经验的程序员.我在工作中遇到了一些旧的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:]-]* ) )?

>打开paren.
>零个或多个数字,短划线或点.
>一个数字
>零个或多个数字,短划线或点.
>关闭paren.

parens建议这是试图解析区号.其余部分将其限制为任意数量的数字,短划线或点,但[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;

如果你对电话号码有所了解,就像这样:

>必填国家代码(必须以a和数字开头)
>可选区号
>可选的电话号码
>可选扩展

这个正则表达式不能很好地验证电话号码.根据此正则表达式,“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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读