手机验证正则表达式

时间:2011-12-26 08:37:39

标签: regex phone-number

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

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

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

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

17 个答案:

答案 0 :(得分:36)

请参阅此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
支持

答案 1 :(得分:21)

enter image description here此解决方案实际验证了数字和格式。例如: 123-456-7890是一种有效的格式,但不是有效的美国号码,这个答案证实了其他人不在的地方。


如果您不想要扩展功能,请删除以下内容,包括括号:  (?:\ S *(?:?#| X | EXT |扩展名)\ S *(\ d +)\ S *?)? :)

编辑 (附录)我在仅客户端应用程序中需要这个,所以我转换了它。这里是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
}

第h。 结束编辑

这允许扩展或不使用.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 extension65432

800 5551212 ext3333

无效#s

234-911-5678

314-159-2653

123-234-5678


  

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

根据herehere关于有效全球数字的信息

当然,这是第一道防线。国际号码的首要元素是它不超过15个字符。我没有为所有非数字写一个替换,并对结果求和。应该完成它。另外,您可能会注意到我没有将北美正则表达式与此结合使用。原因是这个国际正则表达式将匹配北美数字,但是,它也会接受已知的无效{{1}比如#。为了获得更准确的结果,您也应该将它们分开。

未提及暂停和其他拨号工具,因此根据E.164

无效
+1 234-911-5678

1-10个字母用于分机和1-6位数字分机:

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

Valid International:ref的国家名称不匹配。

+55 11 99999-5555 巴西

+593 7 282-3889 厄瓜多尔

(+ 44)0848 9123 456 英国

+1 284 852 5500 BVI

+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 巴西

享受

答案 2 :(得分:8)

考虑:

^\+?[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-'前缀,后跟任何数字序列与破折号交替,每个破折号之间至少有一个数字,末尾没有破折号。

答案 3 :(得分:5)

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

然后使用此正则表达式验证:

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

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

答案 4 :(得分:5)

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

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

答案 5 :(得分:4)

我试过了:

^(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

答案 6 :(得分: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

答案 7 :(得分:3)

^(\+\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

答案 8 :(得分:1)

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

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

它与以下内容匹配(在开始和结束位置限制所有不需要的字符)

  • +251912345678
  • 251912345678
  • 0912345678
  • 912345678

您可以在此网站regexr.

上对其进行测试

答案 9 :(得分:0)

此正则表达式将任意数字与通用格式1-(999)-999-9999以及介于两者之间的任何内容匹配。此外,正则表达式允许大括号或没有大括号和分隔与期间空间破折号"^([01][- .])?(\(\d{3}\)|\d{3})[- .]?\d{3}[- .]\d{4}$"

答案 10 :(得分:0)

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 并经过验证

答案 11 :(得分:0)

/^(([+]{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

答案 12 :(得分:0)

尝试一下

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

它符合以下情况

  • + 123-(456)-(7890)
  • +123。(456)。(7890)
  • +(123)。(456)。(7890)
  • +(123)-(456)-(7890)
  • +123(456)(7890)
  • +(123)(456)(7890)
  • 123-(456)-(7890)
  • 123.(456)。(7890)
  • (123)。(456)。(7890)
  • (123)-(456)-(7890)
  • 123(456)(7890)
  • (123)(456)(7890)

有关模式CLICKME

的进一步说明

答案 13 :(得分:0)

除了@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位数字

答案 14 :(得分:0)

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");  
    }

答案 15 :(得分:0)

  ^[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}。

答案 16 :(得分:0)

^+?\d{3}-?\d{2}-?\d{2}-?\d{3}$

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

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

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