用正则表达式修剪电话号码

时间:2010-04-26 07:04:23

标签: regex

可能是一个简单的正则表达式问题。

如何从电话号码中删除除+ +之外的所有非数字?

即。

012-3456 => 0123456
+1(234)56789 => 123456789

8 个答案:

答案 0 :(得分:9)

/(?<!^)\+|[^\d+]+//g

将删除所有非数字并单独留下前导+。请注意,前导空格将导致“单独保留+”位失败。在.NET语言中,这可以在正则表达式中使用,在其他语言中,您应该在将字符串传递给此正则表达式之前先删除空格。

说明:

(?<!^)\+:匹配+,除非它位于字符串的开头。 (在.NET中,使用(?<!^\s*)\+来允许前导空格。)

|

[^\d+]+:匹配任何既不是数字也不是+的字符。

之前(使用(?<!^\s*)\+|[^\d+]+):

+49 (123) 234 5678
  +1 (555) 234-5678
+7 (23) 45/6789+10
(0123) 345/5678, ext. 666

后:

+491232345678
+15552345678
+72345678910
01233455678666

答案 1 :(得分:2)

在Java中,你可以做到

public static String trimmed(String phoneNumber) {
   return phoneNumber.replaceAll("[^+\\d]", "");
}

这将保留所有+,即使它位于phoneNumber的中间。如果您想删除中间的任何+,请执行以下操作:

return phoneNumber.replaceAll("[^+\\d]|(?<=.)\\+", "");

(?<=.)是一个lookbehind,用于查看+之前是否有前一个字符。

System.out.println("[" + trimmed("+1 (234)++56789 ") + "]");
// prints "[+123456789]"

答案 2 :(得分:1)

如果支持全局正则表达式,您只需替换所有不是数字或加号的字符:

s/[^0-9+]//g

如果不支持全局正则表达式,您可以匹配尽可能多的可能数字组,这些数字组可能在您给定的电话号码格式中有效:

s/([0-9+]*)[^0-9+]*([0-9+]*)[^0-9+]*([0-9+]*)[^0-9+]*([0-9+]*)/\1\2\3\4/

答案 3 :(得分:1)

肯定可能在一个正则表达式中完成所有操作,但我更喜欢更简单的正则表达式,它将正确处理前导加上前导和尾随空格:

#!/usr/bin/perl 
while (<DATA>) {
    print "DATA Read: \$_=$_";  #\n already there...
    s/\s*(.*)\s*/$1/g;
    $s=s/(^\+){0,1}//?$1:'';
    s/[^\d]//g;
    print "Formatted: $s$_\n====\n";
 }


 __DATA__
 012-3456
 +1 (234) 56789
          +1 (234) 56789
 1234-56789        |
 +12345+6789

输出:

DATA Read: $_=012-3456
Formatted: 0123456
====
DATA Read: $_=+1 (234) 56789
Formatted: +123456789
====
DATA Read: $_=         +1 (234) 56789
Formatted: +123456789
====
DATA Read: $_=1234-56789        |
Formatted: 123456789
====
DATA Read: $_=+12345+6789
Formatted: +123456789

答案 4 :(得分:1)

  

如何从电话号码中删除除+ +之外的所有非数字?

(删除)+44 (0) 20 3000 9000以及空格会导致无效的号码+4402030009000。它应该是+442030009000

整理例程需要几个步骤来处理国家/地区代码(带或不带访问代码或+)和/或中继代码和/或标点符号,可以单独使用,也可以任意组合使用。

答案 5 :(得分:0)

只需将除数字和+之外的所有内容替换为“

/[^\d+]/

在Python中,

>>> import re
>>> re.sub("[^\d+]","","+1 (234) 56789")
'+123456789'
>>>

答案 6 :(得分:0)

使用perl,

my $number = // set it equal to phone number
$number =~ s/[^\d+]//g

这仍然允许加号在任何地方,如果你想让它在开头只允许加号,我会把那部分留给你。你不能只给你整个答案,否则你就不会学习。

基本上现在做的是,它会替换$ number中不是数字的任何内容或带有空字符串的加号

答案 7 :(得分:-3)

您不能简单地删除“+”符号。它必须被视为'00'并且属于国家/地区代码。 '+ xx'与'00xx'相同。

无论如何,使用正则表达式处理电话号码就像用正则表达式解析html ......几乎不可能,因为有很多(正确的)拼写格式。

我的建议是编写一个自定义类来处理电话号码,而不是使用正则表达式。