30

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

是否有适用于所有有效手机号码的标准化正则表达式,例如 +27 123 4567?我会推出自己的,但我担心会丢失一个模糊的、有效的电话号码格式。

4

6 回答 6

41

从您的输入中删除除“+”和数字之外的所有字符后,应该这样做:

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

如果您想更准确地了解国家/地区代码,请参阅电话号码国家/地区代码列表中的此问题

但是,我会尽量不要对我的验证过于严格。如果用户被告知他们的有效号码是不可接受的,他们会非常沮丧。

于 2011-05-09T07:38:30.543 回答
6

即使您编写了一个与字符串中的“有效电话号码”子​​集完全匹配的正则表达式,也无法保证(通过正则表达式)它们是有效的手机号码。在一些国家,手机号码与固定电话号码没有区别,至少没有号码计划查找,在某些情况下,即使这样也无济于事。例如,在瑞典,很多人已经将他们常规的、类似于固定电话的电话号码“移植”到他们的手机上。它仍然是他们以前的号码,但现在它转到手机而不是固定电话。

由于有效的电话号码仅包含数字,我怀疑滚动您自己的电话号码至少会丢失一些不起眼的电话号码。如果您想获得更好的确定性,请编写一个生成器,该生成器获取所有有效国家代码的列表,并要求电话号码开头的其中一个与生成的正则表达式匹配。

于 2011-02-21T13:22:33.483 回答
2
^\+[1-9]{1}[0-9]{7,11}$ 

^\+[1-9]{1}[0-9]{7,11}$ 对于“+290 8000”和短于 8 位的类似有效数字,正则表达式 失败。

最长的数字可能是 3 位国家代码、3 位地区代码、8 位用户号码、14 位数字。

于 2011-09-29T07:12:27.997 回答
2

Posting a note here for users looking into this into the future. Google's libphonenumber is what you most likely would want to use. There is wrappers for PHP, node.js, Java, etc. to use the data which Google has been collecting and reduces the requirements for maintaining large arrays of regex patterns to apply.

于 2014-09-02T23:16:53.910 回答
1

即使是关于国际号码,我也希望代码如下:

/^(\+|\d)[0-9]{7,16}$/;

因为您也可以拥有以“00”开头的国际号码。

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

于 2013-05-21T14:49:26.893 回答
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;
    }
}
于 2014-03-12T06:58:32.927 回答