我试图抓住手机已知行号前面的任何数字(如果存在)(在Perl中)。没有破折号,只有数字。
例如,假设我知道行号始终为8675309. 8675309可能有也可能没有前导数字,如果有,我想捕获它们。领先数字的数量并没有真正的限制。
$input $digits $number
'8675309' '' '8675309'
'8008675309' '800' '8675309'
'18888675309' '1888' '8675309'
'18675309' '1' '8675309'
'86753091' not a match
/8675309$/
这将匹配如何捕获一个正则表达式中的前数字?
答案 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'。