我试图抓住任何数字在电话的已知行数的前面,如果存在的话(在Perl)。不会有破折号,只有数字。

举例来说,说我知道的行数将永远是8675309. 8675309可能会或可能不会有领先的数字,如果是这样我想捕捉它们。确实没有上的领先数字的数目的限制。

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

/8675309$/这将匹配如何捕获预位在一个正则表达式?

有帮助吗?

解决方案

有些正则表达式比前锋更好地工作倒退。所以有时是有用的使用sexeger,而不是正则表达式。

my $pn = '18008675309';

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

在正则表达式是清洁器,并且避免了大量的背部的一些fummery的成本与反转输入和捕获的值进行跟踪。

回溯增益在这种情况下小于这将是如果你有一个普通的电话号码提取的正则表达式:

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

这里有一整类的问题,其中该技术是有用的。有关详细信息请参阅上Perlmonks 中sexeger交

其他提示

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) = "";

在正则表达式特殊变量$`和$&是抓住那些信息的另一种方式。他们认为比赛分别在比赛本身之前数据的内容。

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

有一个Perl包,至少有英国和美国的电话号码的交易。

这就是所谓的数::电话和代码是关于cpan.org网站的某个地方。

如何/(\d)?(8675309)/? UPDATE:应已/(\d*)(8675309)/哎呦

我可能不明白的问题。为什么会出现在第一和第四实施例之间的差:

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

如果你想要的是从一切最后七位数字分开,你可能会说这种方式,而不是提供混乱的例子。一种用于该正则表达式将是:

  

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

如果你不只是提供了一个假设数目,真的只是在寻找与线“8675309”(似乎很奇怪),与“8675309”取代“\ d {7,7}”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top