Perl电话号码正则表达式

约旦

很抱歉提出这样一个简单的问题,我仍然是一个没有经验的程序员。我在工作中的一些旧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。
  • 零个或多个数字,空格,破折号或点。
  • 一个号码
  • 零个或多个数字,空格,破折号或点。
  • 关闭括号。

家长认为这是在尝试解析区号。其余的将其限制为任意数量的数字,空格,破折号或点,但是请[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. 强制性国家/地区代码(必须以+和数字开头)
  2. 可选区号
  3. 可选电话号码
  4. 可选扩展

此正则表达式在验证电话号码方面做得不好。根据此正则表达式,“ + 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

瑞典电话号码正则表达式

来自分类Dev

正则表达式与荷兰电话号码

来自分类Dev

提取电话号码正则表达式

来自分类Dev

电话号码正则表达式

来自分类Dev

正则表达式-电话号码-Android

来自分类Dev

正则表达式的电话号码?

来自分类Dev

阿联酋电话号码正则表达式

来自分类Dev

正则表达式用于拆分电话号码

来自分类Dev

特定电话号码正则表达式

来自分类Dev

正则表达式红宝石电话号码

来自分类Dev

匹配电话号码,正则表达式

来自分类Dev

法国电话号码的正则表达式

来自分类Dev

正则表达式验证电话号码扩展

来自分类Dev

使用正则表达式清理电话号码

来自分类Dev

荷兰电话号码的正则表达式

来自分类Dev

电话号码的正则表达式

来自分类Dev

正则表达式的电话号码?

来自分类Dev

MVC 5正则表达式电话号码

来自分类Dev

正则表达式寻找好的电话号码

来自分类Dev

电话号码匹配正则表达式

来自分类Dev

用于电话号码验证的正则表达式

来自分类Dev

日本电话号码的正则表达式

来自分类Dev

正则表达式识别电话号码

来自分类Dev

电话号码以 + 开头的正则表达式

来自分类Dev

正则表达式电话号码

来自分类Dev

波兰电话号码的正则表达式

来自分类Dev

html中电话号码的正则表达式

来自分类Dev

电话号码的正则表达式验证

来自分类Dev

电话号码的 Javascript 正则表达式