如何解析Perl中的电话号码?

时间:2010-01-14 15:43:36

标签: regex perl phone-number

我试图抓住手机已知行号前面的任何数字(如果存在)(在Perl中)。没有破折号,只有数字。

例如,假设我知道行号始终为8675309. 8675309可能有也可能没有前导数字,如果有,我想捕获它们。领先数字的数量并没有真正的限制。

$input          $digits       $number
'8675309'       ''            '8675309'
'8008675309'    '800'         '8675309'
'18888675309'   '1888'        '8675309'
'18675309'       '1'           '8675309'
'86753091'      not a match

/8675309$/这将匹配如何捕获一个正则表达式中的前数字?

6 个答案:

答案 0 :(得分:9)

有些正则表达式比向前表现更好。所以有时使用性爱者而不是正则表达式是有用的。

my $pn = '18008675309';

reverse($pn) =~ /^9035768(\d*)/;
my $got = reverse $1;

正则表达式更清晰,避免了大量的反向跟踪,但是以扭转输入和捕获值为止的一些惨败为代价。

在这种情况下,回溯增益小于使用普通电话号码提取正则表达式时的回溯增益:

Regex:   /^(\d*)\d{7}$/
Sexeger: /^\d{7}(\d*)/

这种技术很有用,存在一类问题。有关详细信息,请参阅the sexeger post on Perlmonks

答案 1 :(得分:2)

my($digits,$number);
if ($input =~ /^(\d*)(8675309)$/) {
  ($digits,$number) = ($1,$2);
}

*量词是贪婪的,但这意味着它尽可能匹配,同时仍允许匹配。所以最初,是的,\d*试图吞噬$number中的所有数字,但它不情愿地逐个字符地放弃它匹配的内容,直到整个模式成功匹配。

另一种方法是砍掉尾巴:

(my $digits = $input) =~ s/8675309$//;

您可以在不使用正则表达式的情况下执行相同的操作:

my $digits = $input;
substr($digits, -7) = "";

以上,至少与perl-5.10-1一样,甚至可以缩小为

substr(my $digits = $input, -7) = "";

答案 2 :(得分:1)

正则表达式特殊变量$`和$&是获取这些信息的另一种方式。它们分别保存匹配前的数据内容和匹配本身。

   if ( /8675309$/ )
      {
      printf( "%s,%s,%s\n", $_, $`, $& );
      }
   else
      {
      printf( "%s,Not a match\n", $_ );
      }

答案 3 :(得分:1)

有一个Perl软件包至少可以处理英国和美国的电话号码。

它叫做Number :: Phone,代码在cpan.org网站上。

答案 4 :(得分:0)

/(\d)?(8675309)/怎么样? 更新:应该是/(\d*)(8675309)/

的呐喊

答案 5 :(得分:0)

我可能不明白这个问题。为什么第一个和第四个例子之间存在差异:

'8675309'    ''   '8675309'  
...  
'8675309'    '1'  '8675309'

如果您想要的是将最后七位数与其他所有数字分开,您可以这样说,而不是提供令人困惑的例子。正则表达式是:

  

/(\ d *)(\ d {7,7})$ /

如果您不只是提供一个假设的数字,并且真的只是寻找带有'8675309'的行(看起来很奇怪),请将'\ d {7,7}'替换为'8675309'。