我需要添加一个匹配所有可能的有效E.164格式电话号码的正则表达式。
此正则表达式适用于北美电话号码,但我需要一些适用于国际号码的内容:
^(+ 1 | 1)〜([2-9] \ d \ d [2-9] \ d {6})$
示例:+13172222222匹配 13172222222仍然匹配,因为+1或1是可选的 3172222222仍然匹配,因为+1或1是可选的 3171222222不匹配且不是有效的NANPA编号。
我也遇到了this related question,但我认为这对我的需求来说太疯狂了。就我而言,我只是在验证黑名单的条目,我将其与传入的Twilio数据进行比较;所以,我更关心国家代码有效的天气。我真的只需要测试一个数字是否与一般的E.164形式相匹配,而不是假设它是一个NANPA。
为了更好地理解我需要匹配的内容,以下是Twilio Documentation:
中的示例请求中的所有电话号码 如果,Twilio是E.164格式 可能。例如,(415)555-4345 会以'+14155554345'的形式出现。 但是,偶尔会出现这种情况 Twilio无法正常化的地方 传入的来电显示为E.164。在这些 情况Twilio将报告原始 来电显示字符串。
我希望匹配+14155554345,但不匹配(415)555-4345,4155555434,555-4345或5554345.正则表达式不应仅限于匹配美国国家/地区代码。基本上,它应该与+ xxxxxxxxxxx格式匹配。我还认为这个数字可能会更长,因为有多位数的国家/地区代码,例如在英国。 T-Mobile的英国号码是+447953966150如果我能想出一个更好的例子,我会更新这个。
答案 0 :(得分:82)
接受的答案是好的,但E.164号码最多可以有15位数字。规范也没有说明最低限度,因此我不一定指望10。
应为^\+?[1-9]\d{1,14}$
。
答案 1 :(得分:14)
我认为,除非你有一套很好的例子,否则最好是灵活的正则表达式。这个匹配+
后跟10-14位数。
^\+?\d{10,14}$
细分,这个表达意味着:
^
匹配字符串的开头。
\+?
可选择匹配+
符号。
\d{10,14}
匹配10到14位数字。
$
确保我们位于字符串的末尾。
如果你知道特定索引处的数字不能是1或0,那么你可以在那个位置使用[2-9]
,如下所示:
^\+?\d{6,7}[2-9]\d{3}$
[2-9]
表示匹配2到9之间的任何数字(不匹配0或1。)
答案 2 :(得分:1)
这仅匹配+16174552211
和16174552211
/\A\+?\d{11}\z/
如果您使用Twilio和Ruby on Rails
,它尤其有用答案 3 :(得分:0)
答案 4 :(得分:0)
好吧,我使用了接受的答案,但在很多情况下失败了:
对于以下输入:
正则表达式失败了。
我终于使用了
^\+(?:[0-9]?){6,14}[0-9]$
这就像魅力一样!
答案 5 :(得分:0)
接受的答案不适用于没有' +'标志。我按照维基百科指标进行了一些数学计算,
国家代码:1到3位数,
最大值:15,
实际电话号码:12(15-3)至14(15-1)位数
这方面的最小值是10.例如,虚拟美国号码" + 14155552671"是最低限度的。打破它,+1是美国国家代码,其余的都是'区号' +'订阅者编号'这将是10.在我的研究中,我无法找到一个小于7位的数字(瑞典)并且是有效的。
因此我必须提出的正则表达式与' +'与10~15之间的数字一起签名如下:
^ \ ++?[1-9] [0-9] \ d {6,14} $
这很有效。您可以在Regex101上查看。
答案 6 :(得分:0)
此RegEx ^\\+?[0-9]{1,3}[ 1-9]\\d{1,14}$
也可以在没有无效正则表达式的情况下使用。
答案 7 :(得分:0)
打字稿/Javascript:E.164
这对我有用:
static PHONE_NUMBER = /^\+[1-9]\d{10,14}$/; // E.164
PHONE_NUMBER.test('+' + countryCode + phoneNumber);
参考: https://blog.kevinchisholm.com/javascript/javascript-e164-phone-number-validation/