【问题标题】:Phone validation regex电话验证正则表达式
【发布时间】:2012-01-27 21:08:37
【问题描述】:

我正在使用此模式来检查电话号码的验证

^[0-9\-\+]{9,15}$

它适用于0771234567+0771234567, 但我希望它适用于 077-1234567+077-1234567 和 +077-1-23-45-67 和 +077-123-45-6-7

我应该在模式中改变什么?

【问题讨论】:

  • 你有没有找到足够的解决方案?

标签: regex phone-number


【解决方案1】:

请参考这篇 SO 帖子

example of a regular expression in jquery for phone numbers

/\(?([0-9]{3})\)?([ .-]?)([0-9]{3})\2([0-9]{4})/
  • (123) 456 7899
  • (123).456.7899
  • (123)-456-7899
  • 123-456-7899
  • 123 456 7899
  • 1234567899

支持

【讨论】:

  • 这允许非法/无效#s,包括以下 234-911-5678 & 314-159-2653 & 123-234-5678
  • 信件也通过了
【解决方案2】:

这个解决方案实际上验证了数字和格式。例如:123-456-7890 是有效的格式,但不是有效的美国号码,这个答案证明了其他人不知道的地方。


如果您不希望扩展功能,请删除以下内容,包括括号: (?:\s*(?:#|x.?|ext.?|extension)\s*(\d+)\s*)? :)

edit (addendum) 我需要在仅客户端应用程序中使用它,因此我对其进行了转换。这是给javascript人的:

var myPhoneRegex = /(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]‌​)\s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)([2-9]1[02-9]‌​|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})\s*(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+)\s*)?$/i;
if (myPhoneRegex.test(phoneVar)) {
    // Successful match
} else {
    // Match attempt failed
}

hth。 结束编辑

这是否允许扩展并适用于 .NET

(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]‌​)\s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)([2-9]1[02-9]‌​|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$

验证是否有尾随空格。也许在使用 .NET 验证器和修剪服务器端时使用这个略有不同的正则表达式:

(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]‌​)\s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)([2-9]1[02-9]‌​|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})\s*(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+)\s*)?$

全部有效:

1 800 5551212

800 555 1212

8005551212

18005551212

+1800 555 1212 分机号65432

800 5551212 分机3333

#s 无效

234-911-5678

314-159-2653

123-234-5678


编辑:根据 Felipe 的评论,我已将其更新为国际版。

根据我从herehere 中找到的有关有效全球号码的信息

这当然是作为第一道防线进行测试的。国际号码的一个重要元素是不超过 15 个字符。我没有为所有非数字写一个替换并将结果求和。为了完整性,应该这样做。另外,您可能会注意到我没有将北美正则表达式与这个组合。原因是这个国际正则表达式将匹配北美数字,但是它也会接受已知的无效# 这样的作为+1 234-911-5678。为了获得更准确的结果,您还应该将它们分开。

没有提到暂停和其他拨号工具,因此根据 E.164 无效

\(?\+[0-9]{1,3}\)? ?-?[0-9]{1,3} ?-?[0-9]{3,5} ?-?[0-9]{4}( ?-?[0-9]{3})?

1-10个字母的词作为扩展名和1-6位数字的扩展名:

\(?\+[0-9]{1,3}\)? ?-?[0-9]{1,3} ?-?[0-9]{3,5} ?-?[0-9]{4}( ?-?[0-9]{3})? ?(\w{1,10}\s?\d{1,6})?

有效国际:ref 的国家名称不匹配。

+55 11 99999-5555 巴西

+593 7 282-3889 厄瓜多尔

(+44) 0848 9123 456 英国

+1 284 852 5500 英属维尔京群岛

+1 345 9490088 大开曼岛

+32 2 702-9200 比利时

+65 6511 9266 亚太地区

+86 21 2230 1000 上海

+9124 4723300 印度

+821012345678 韩国

为了您的扩展乐趣

+55 11 99999-5555 ramal 123 巴西

+55 11 99999-5555 foo786544 巴西

享受

【讨论】:

  • 为什么这个号码无效? +55 11 99999-5555
  • 看起来我需要为巴西(国际)更新我会处理这个并更新答案。很好的收获。
  • 巴西的有效号码:+55.19.99999-9999, 19 4444-4444, (19)99999999 - 应该不错,包括一些主要语言的“extension”翻译,例如:“ramal”葡萄牙语,还有:西班牙语、意大利语、日本等 - 或者让用户输入任意字符,然后在最后一个数字后跟一个数字,例如:+55.19.99999-9999 ramal 123 或 +55.19.99999-9999 xpto 123
  • 我不确定您的正则表达式是否支持这一点,但像#、逗号 (,)、分号 (;) 和其他符号这样的符号可能具有特殊含义。在某些地方需要暂停,例如键入扩展名。所以这也应该是有效的:+55 11 99999-5555, , , 445 - 看看这个:support.apple.com/kb/PH18551?locale=en_US
  • +31 6 11 11 11 11(荷兰)或使用“00”而不是“+”,因此如果您也想覆盖这些数字,您可以使用扩展版本:/( ?\+?[0-9]{1,3})? ?-?[0-9]{1,3} ?-?[0-9]{2,5} ?-?[0-9]{2,5}( ?-?[0-9]{2 ,5})? ?(\w{1,10}\s?\d{1,6})?/
【解决方案3】:

考虑:

^\+?[0-9]{3}-?[0-9]{6,12}$

这只允许+开头;它需要 3 位数字,后跟一个可选的破折号,然后是 6-12 个数字。

请注意,原始正则表达式允许使用“电话号码”,例如 70+12---12+92,这比您可能想象的要宽松一些。


问题修改为:

+077-1-23-45-67 和 +077-123-45-6-7

您现在可能需要使用支持替代方案的正则表达式系统:

^\+?[0-9]{3}-?([0-9]{7}|[0-9]-[0-9]{2}-[0-9]{2}-[0-9]{2}|[0-9]{3}-[0-9]{2}-[0-9]-[0-9])$

第一种选择是七位数;第二个是 1-23-45-67;第三个是 123-45-6-7。这些都共享可选的加号+,后跟3 位数字和一个可选的破折号- 前缀。

下面的评论提到了另一种模式:

+077-12-34-567

完全不清楚一般模式应该是什么 - 可能是一个或多个用破折号分隔的数字;前后数字?

^\+?[0-9]{3}-?[0-9](-[0-9]+)+$

这将允许'+077-'前缀,后跟任何与破折号交替的数字序列,每个破折号之间至少有一个数字,最后没有破折号。

【讨论】:

  • 谢谢,但是这种格式怎么样:+077-12-34-567。我希望它是全球性的。
【解决方案4】:

我有一个更通用的正则表达式,允许用户只输入数字,+-whitespace()。它尊重括号平衡,符号后面总是有一个数字。

^([+]?[\s0-9]+)?(\d{3}|[(]?[0-9]+[)])?([-]?[\s]?[0-9])+$

false, ""
false, "+48 504 203 260@@"
false, "+48.504.203.260"
false, "+55(123) 456-78-90-"
false, "+55(123) - 456-78-90"
false, "504.203.260"
false, " "
false, "-"
false, "()"
false, "() + ()"
false, "(21 7777"
false, "+48 (21)"
false, "+"
true , " 1"
true , "1"
true, "555-5555-555"
true, "+48 504 203 260"
true, "+48 (12) 504 203 260"
true, "+48 (12) 504-203-260"
true, "+48(12)504203260"
true, "+4812504203260"
true, "4812504203260

【讨论】:

    【解决方案5】:
    /^[0-9\+]{1,}[0-9\-]{3,15}$/
    

    所以首先是一个数字或一个+,然后是一些数字或-

    【讨论】:

      【解决方案6】:

      先测试字符串的长度,看是否在9到15之间。

      然后使用这个正则表达式来验证:

      ^\+?\d+(-\d+)*$
      

      这是normal* (special normal*)* 模式的另一种变体,normal\dspecial-

      【讨论】:

      • 如果由于某种原因你必须使用正则表达式来做长度,试试这个:^(?=.{9})(?!.{16})\+?\d+(-\d+)*$。但是检查长度的解决方案更清洁恕我直言;)
      • @markijbema ouch :p 在这种情况下还不如写 (?=.{9,15}) ;)
      • 那么你至少需要一个 $,但我不确定它是否适用于多个 $,但如果可以,那确实更干净了。
      • 它确实有效,因为环视运算符是锚点,不会消耗任何东西。但这意味着重复输入两次......即(?=.{9,15}$)
      【解决方案7】:

      这是埃塞俄比亚电话号码的正则表达式。对于我的埃塞俄比亚开发人员 ;)

      phoneExp = /^(^\+251|^251|^0)?9\d{8}$/;
      

      它匹配以下(限制任何不需要的字符在开始和结束位置)

      • +251912345678
      • 251912345678
      • 0912345678
      • 912345678

      你可以在这个网站上测试它regexr.

      【讨论】:

        【解决方案8】:

        我试过了:

        ^(1[ \-\+]{0,3}|\+1[ -\+]{0,3}|\+1|\+)?((\(\+?1-[2-9][0-9]{1,2}\))|(\(\+?[2-8][0-9][0-9]\))|(\(\+?[1-9][0-9]\))|(\(\+?[17]\))|(\([2-9][2-9]\))|([ \-\.]{0,3}[0-9]{2,4}))?([ \-\.][0-9])?([ \-\.]{0,3}[0-9]{2,4}){2,3}$
        

        我还负责处理特殊的国家代码,例如 1-97...。以下是我测试的数字(来自 Puneet Lamba 和 MCattle):

        ***** PASS *****
        18005551234
        1 800 555 1234
        +1 800 555-1234
        +86 800 555 1234
        1-800-555-1234
        1.800.555.1234
        +1.800.555.1234
        1 (800) 555-1234
        (800)555-1234
        (800) 555-1234
        (800)5551234
        800-555-1234
        800.555.1234
        (+230) 5 911 4450
        123345678
        (1) 345 654 67
        +1 245436
        1-976 33567
        (1-734) 5465654
        +(230) 2 345 6568
        ***** CORRECTLY FAILING *****
        (003) 555-1212
        (103) 555-1212
        (911) 555-1212
        1-800-555-1234p
        800x555x1234
        +1 800 555x1234
        ***** FALSE POSITIVES *****
        180055512345
        1 800 5555 1234
        +867 800 555 1234
        1 (800)  555-1234
        86 800 555 1212
        

        原帖在这里:Regular expression to match standard 10 digit phone number

        【讨论】:

          【解决方案9】:
          ^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$
          

          符合以下情况:

          123-456-7890

          (123) 456-7890

          123 456 7890

          123.456.7890

          +91 (123) 456-7890

          【讨论】:

            【解决方案10】:

            试试这个

            \+?\(?([0-9]{3})\)?[-.]?\(?([0-9]{3})\)?[-.]?\(?([0-9]{4})\)?
            

            符合以下情况

            • +123-(456)-(7890)
            • +123.(456).(7890)
            • +(123).(456).(7890)
            • +(123)-(456)-(7890)
            • +123(45​​6)(7890)
            • +(123)(456)(7890)
            • 123-(456)-(7890)
            • 123.(456).(7890)
            • (123).(456).(7890)
            • (123)-(456)-(7890)
            • 123(45​​6)(7890)
            • (123)(456)(7890)

            关于模式的进一步解释CLICKME

            【讨论】:

            • 感谢您提醒我注意这一点。现在状态很好@Toto
            【解决方案11】:
            The following regex matches a '+' followed by n digits
            
            
                var mobileNumber = "+18005551212";
                var regex = new RegExp("^\\+[0-9]*$");
                var OK = regex.test(mobileNumber);
            
                if (OK) {
                  console.log("is a phone number");
                } else {
                  console.log("is NOT a phone number");  
                }
            

            【讨论】:

              【解决方案12】:
              ^+?\d{3}-?\d{2}-?\d{2}-?\d{3}$
              

              你可以试试这个......

              这个怎么样....希望这有帮助...

              ^(\\+?)\d{3,3}-?\d{2,2}-?\d{2,2}-?\d{3,3}$
              

              【讨论】:

              • 他们不是在全球范围内做这件事的选择吗?所以即使它适用于 0-7-7-1-2-3-4-5-6-7?
              • ^(\+?)\d{3,3}(\-?)\d{2,2}(\-?)\d{2,2}(\-?) \d{3,3}$....两者中的任何一个都可以工作...我目前无法检查它们的真实性...
              • @Nir:如果答案不成立,请随时分享……或者如果他们解决了您的问题,请接受。
              • 我想对任何情况以及数字和破折号的任何组合都这样做
              【解决方案13】:
                ^[0-9\-\+]{9,15}$ 
              

              将匹配 0+0+0+0+0+0,或 000000000 等。

                (\-?[0-9]){7}
              

              将匹配特定数量的数字,其中任意位置带有可选连字符。

              这个 +077 格式应该是什么?

              这不是一个有效的格式。没有以 0 开头的国家/地区代码。

              + 后面的数字通常应该是国家代码,长度为 1 到 3 位。

              允许使用“+”,然后是国家代码 CC,然后是可选连字符,然后是“0”加上两位数,然后是连字符和接下来的七位数字,尝试:

                ^\+CC\-?0[1-9][0-9](\-?[0-9]){7}$
              

              哦,{3,3} 是多余的,简化为 {3}。

              【讨论】:

                【解决方案14】:

                此正则表达式匹配任何数字,通用格式为 1-(999)-999-9999 以及介于两者之间的任何数字。此外,正则表达式将允许使用大括号或不使用大括号,并使用句点空格破折号进行分隔。 "^([01][- .])?(\(\d{3}\)|\d{3})[- .]?\d{3}[- .]\d{4}$"

                【讨论】:

                  【解决方案15】:

                  添加到@Joe Johnston 的答案,这也将接受:

                  +16444444444,,241119933
                  

                  (Apple 对拨入的特殊字符支持是必需的 - https://support.apple.com/kb/PH18551?locale=en_US

                  \(?\+[0-9]{1,3}\)? ?-?[0-9]{1,3} ?-?[0-9]{3,5} ?-?[0-9]{4}( ?-?[0-9]{3})? ?([\w\,\@\^]{1,10}\s?\d{1,10})?
                  

                  注意:分机代码最多接受 10 位数字

                  【讨论】:

                    【解决方案16】:
                    /^(([+]{0,1}\d{2})|\d?)[\s-]?[0-9]{2}[\s-]?[0-9]{3}[\s-]?[0-9]{4}$/gm
                    

                    https://regexr.com/4n3c4

                    测试

                    +94 77 531 2412

                    +94775312412

                    077 531 2412

                    0775312412

                    77 531 2412

                    // 不匹配

                    77-53-12412

                    +94-77-53-12412

                    077 123 12345

                    77123 12345

                    【讨论】:

                    • 这个正则表达式有很多问题:1. 国家代码最多可以有三个数字。 2.你正在检查digit的国家代码,这也包括٠١٢٣٤٥٦٧٨٩ # ARABIC-INDIC(来源:unix.stackexchange.com/a/414230
                    【解决方案17】:

                    JS代码:

                    function checkIfValidPhoneNumber(input){
                        "use strict";
                        if(/^((\+?\d{1,3})?[\(\- ]?\d{3,5}[\)\- ]?)?(\d[.\- ]?\d)+$/.test(input)&&input.replace(/\D/g,"").length<=15){
                            return true;
                        } else { 
                            return false;
                        }
                    }
                    

                    检查电话号码方面可能很原始,但它检查输入文本是否符合 E.164 建议。

                    1. 电话长度上限为 15 位
                    2. 国家/地区代码由 1 到 3 位数字组成,前面可以加加号(可以省略)
                    3. 地区(网络)代码由 3 到 5 位数字组成(可以省略,但前提是国家代码省略)

                    它允许在电话号码和地区代码周围使用一些分隔符 (.- ) 例如:

                    +7(918)000-12-34

                    911

                    1-23456-789.10.11.12

                    所有都符合 E.164 并经过验证

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多