用于有效国际移动电话号码的正则表达式

37

我使用Clickatell向客户手机发送短信。

是否有一个标准化的正则表达式适用于所有有效的手机号码,例如:+27 123 4567?我可以自己编写一个,但我担心会错过一些不常见但是合法的电话号码格式。


3
为什么不试着给客户提供的电话号码发送短信?让短信中包含一个唯一代码,客户需要输入该代码才能继续。 - Tim Pietzcker
2
哇!!你在2011年就说过这个了。而今天我们有了广泛使用的OTP概念。 - sid-m
6个回答

52

从您的输入中除了 '+' 和数字之外,应该这样做:

^\+[1-9]{1}[0-9]{3,14}$

如果您想更准确地了解国际电话代码,请查看电话号码国际代码列表中的这个问题。

然而,我会尽量不太严格地验证。如果告诉用户他们的有效号码不可接受,那么他们会感到非常沮丧。


1
@snoopy:好链接!是的,在这种情况下,^+[1-9]{1}[0-9]{7,11}$ 可能是最严格的正则表达式。 - Jannie Theunissen
10
根据E.164,国际电话号码最长可达15位,没有最小长度限制,除了国家代码至少需一个数字和用户号码至少需一个数字(最短为三个数字)外。因此上述正则表达式应该是:^\+[1-9]{1}[0-9]{1,14}$ - Sergei
1
非常好的参考,谢尔盖!我会调整我的回答,但是我会怀疑任何国际电话号码少于四位数的人。 - Jannie Theunissen
1
好的。到目前为止,我找到的最短的号码来自新西兰,长度为5位数字:+64010。由于E.164没有定义最小值,个人认为,为了未来的考虑,我会允许两位数的国际号码。 - Sergei
4
无论具体的国家代码是什么,这个 ^([0|\+[0-9]{1,5})?([0-9]{10})$ 也适用于任何以 + 或任何其他数字开头的普通电话号码。 - sohaiby
显示剩余10条评论

6
即使你编写了一个可以匹配字符串中的“有效电话号码”子集的正则表达式,也无法保证它们是有效的移动电话号码(在多个国家地区,移动电话和固定电话号码没有明显区别,至少需要查询号码计划,有时甚至这也没用)。例如,在瑞典,许多人已经将其类似于固定电话的常规电话号码转移到了他们的移动电话上。虽然号码与之前相同,但现在是到移动电话而不是固定电话。
由于有效的电话号码只由数字组成,因此我怀疑自己编写的程序可能会错过某些模糊的电话号码情况。如果您想要更好的确定性,请编写一个生成器,该生成器需要一份所有有效国家代码的列表,并要求将其中一个代码放在电话号码的开头以通过生成的正则表达式进行匹配。

我明白并非所有的手机号码都是存在的,我只需要验证格式以避免数据输入错误(例如填写错误的字段)。 - Petrus Theron
1
@FreshCode,那不是我想说的。我的意思是,有些电话号码根本无法从数字序列中判断它是座机还是手机。由于你的问题是要求一个正则表达式来检查给定字符串是否为有效的移动电话号码,所以这很相关。 - user
好的观点。我应该澄清一下,所谓有效性是指“一个可能的电话号码”,例如12345,但不包括xyz123。 - Petrus Theron

3
^\+[1-9]{1}[0-9]{7,11}$ 

正则表达式^\+[1-9]{1}[0-9]{7,11}$无法匹配长度小于8位的有效号码,例如"+290 8000"。最长的号码可能是由3位国家代码、3位区号和8位用户号码组成的14位数字。为了解决这个问题,可以使用正则表达式^\+[1-9]{1}[0-9]{6,12}$,其中{6,12}表示号码长度在7到13之间。

2

在这里为那些未来寻找相关信息的用户发布一条注记。Google的libphonenumber是您最可能想要使用的内容。有PHP、node.js、Java等语言的包装器可以使用Google一直在收集的数据,从而减少了维护大量正则表达式模式数组的要求。


1
虽然它涉及国际号码,但我希望代码的格式为:
/^(\+|\d)[0-9]{7,16}$/;

你可以使用以“00”开头的国际号码。

我为什么更喜欢使用15位数字:http://en.wikipedia.org/wiki/E.164


0

// 正则表达式 - 检查新加坡有效的手机号码

public static boolean isSingaporeMobileNo(String str) {
    Pattern mobNO = Pattern.compile("^(((0|((\\+)?65([- ])?))|((\\((\\+)?65\\)([- ])?)))?[8-9]\\d{7})?$");
    Matcher matcher = mobNO.matcher(str);
    if (matcher.find()) {
        return true;
    } else {
        return false;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接