【问题标题】:Regular expression matching E.164 formatted phone numbers匹配 E.164 格式电话号码的正则表达式
【发布时间】:2011-09-22 15:51:10
【问题描述】:

我需要添加一个匹配所有可能的有效 E.164 格式电话号码的正则表达式。

这个正则表达式适用于北美电话号码,但我需要一些适用于国际号码的东西:

^(+1|1)?([2-9]\d\d[2-9]\d{6})$

示例:+13172222222 匹配 13172222222 仍然匹配,因为 +1 或 1 是可选的 3172222222 仍然匹配,因为 +1 或 1 是可选的 3171222222 不匹配且不是有效的 NANPA 编号。

来源:Freeswitch.org

我也遇到了this related question,但我认为这对我的需求来说太疯狂了。就我而言,我只是验证黑名单的条目,我将其与传入的 Twilio 数据进行比较;所以,我不太关心国家代码是否有效的天气。我真的只需要测试一个数字是否与一般的E.164 形式匹配,而不是假设它是 NANPA。

为了更好地理解我需要匹配的内容,这里有一个来自Twilio Documentation 的示例:

请求中的所有电话号码来自 Twilio 是 E.164 格式,如果 可能的。例如,(415) 555-4345 将以“+14155554345”的形式出现。 不过也有偶尔的情况 Twilio 无法规范化 来电显示到 E.164。在这些 情况 Twilio 将报告原始 来电显示字符串。

我想匹配 +14155554345 之类的内容,但不匹配 (415) 555-4345、415555434、555-4345 或 5554345。不过,正则表达式不应仅限于匹配美国国家/地区代码。基本上,它应该匹配 +xxxxxxxxxxx 格式。我还认为这个数字可能会更长,因为有多位数的国家代码,例如在英国。 T-Mobile 的英国号码是 +447953966150,如果我能想出更好的例子,我会更新这个。

【问题讨论】:

  • 我注意到,当您提供您尝试匹配的内容的示例时,人们最愿意提供帮助...至少解释一下您知道如何匹配的输入与输入你没有。
  • 抱歉,我花了这么长时间才找到一个例子。我找不到任何关于 E.164 格式的明确文档,所以我在其中包含了 Twilio 简介。
  • 这些看起来仍然像美国的电话号码。 Freeswich.org 的正则表达式匹配你 +14155554345 的那个(好吧,如果你用 \+ 转义第一个 +)。 ^(\+1|1)?([2-9]\d\d[2-9]\d{6})$
  • @agent-j 我添加了一个英国的例子。
  • 对我来说,棘手的部分是扩展......如果他们输入“+1 (999)-999-999 分机 191”或“11 99 8888 8888 分机 9909”怎么办?

标签: regex


【解决方案1】:

接受的答案很好,除了 E.164 号码最多可以有 15 位数字。规范也没有指出最小值,所以我不一定指望 10。

应该是^\+?[1-9]\d{1,14}$

http://en.wikipedia.org/wiki/E.164

【讨论】:

  • 新西兰服务号码可以短至 5 位数字,包括国家代码,例如:+64010。也许答案应该更新为^\+?\d{5,15}$?甚至更好:^\+?[1-9]\d{4,14}$ 考虑到没有以 0 开头的国家/地区代码这一事实。就我个人而言,我会使用 ^\+?[1-9]\d{1,14}$,因为 E.164 中没有定义订户号码的最小长度。
  • 是的,这样更好。我没有想到第一位数字的特殊情况。
  • 也许,然后更新你的答案?其他人将更容易获得他们正在寻找的正则表达式。
  • 附加说明:如果您的正则表达式不支持“\d”快捷方式,请改用“[0-9]”。
  • 对于像 Twilio 这样的服务,+ 在 E.164 中不是可选的,所以删除 ? + ^\+[1-9]\d{1,14}$ 之后
【解决方案2】:

我认为,在您拥有大量示例之前,最好使用灵活的正则表达式。这将匹配 + 后跟 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。)

【讨论】:

  • 谢谢!这正是我现在所需要的。如果我在此过程中碰巧了解了有关数字格式的更多信息,我将自己回答这个问题。
  • “如 ITU 所述,E.164 通用格式必须仅包含以下拆分的数字: - 国家代码(1 到 3 位) - 用户号码(最多 12 位)” 它应该成为d{10,15}
【解决方案3】:

好吧,我使用了公认的答案,但在很多情况下都失败了:

对于像这样的输入:

  • 数字不是以“+”开头的。
  • 数量少于 9。

正则表达式失败。

终于用上了

^\+(?:[0-9]?){6,14}[0-9]$

这就像一个魅力!

【讨论】:

【解决方案4】:

这仅匹配 +1617455221116174552211 等格式

/\A\+?\d{11}\z/

如果您使用的是 Twilio 和 Ruby on Rails,这将特别有用

【讨论】:

    【解决方案5】:

    打字稿/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/

    【讨论】:

      【解决方案6】:

      您提供的正则表达式应该可以工作,只是最初的 + 需要转义。

      /^(\+1|1)?[2-9]\d\d[2-9]\d{6}$/g
      

      看到它在工作 http://refiddle.com/19x

      【讨论】:

      • 感谢您提供的信息以及指向 refiddle 的链接;多么有用的网站!我最终需要的正则表达式不仅匹配美国数字。当我最初只以美国数字的形式提供示例时,引起了混乱,因为这些是我当时能找到的唯一格式化示例。上面的正则表达式对于任何想要匹配 E.164 格式的美国号码的人仍然有用。
      【解决方案7】:

      接受的答案不适用于没有“+”号的数字。我根据维基百科的指标做了一些数学运算, 国家代码:1 到 3 位数字,
      最大:15, 实际电话号码:12(15-3 时)到 14(15-1)位

      这方面的最小值是 10。例如,虚拟美国号码“+14155552671”是最低限度。分解一下,+1 是美国国家代码,其余都是“区号”+“用户号码”,这将是 10。在我的研究中,我找不到小于 7 位的数字(瑞典)并且有效。

      所以我必须想出的正则表达式与“+”号以及位于 10~15 之间的数字一起工作如下:

      ^\++?[1-9][0-9]\d{6,14}$

      这很好用。您可以在Regex101 上查看。

      【讨论】:

      • 这也不适用于没有加号的数字。 16135551212 为什么你允许无限​​+?此外,Twilio 等服务通常需要 +。国家代码也不以 0 开头。
      【解决方案8】:

      这个 RegEx ^\\+?[0-9]{1,3}[ 1-9]\\d{1,14}$ 也可以在没有无效正则表达式的情况下工作。

      【讨论】:

        猜你喜欢
        • 2017-06-06
        • 2010-12-16
        • 1970-01-01
        • 2020-01-18
        • 1970-01-01
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多