正则表达式以匹配标准的10位数电话号码


125

我想为支持以下格式的美国标准电话号码写一个正则表达式:

###-###-####
(###) ###-####
### ### ####
###.###.####

其中#表示任何数字。到目前为止,我想出了以下表达式

^[1-9]\d{2}-\d{3}-\d{4}
^\(\d{3}\)\s\d{3}-\d{4}
^[1-9]\d{2}\s\d{3}\s\d{4}
^[1-9]\d{2}\.\d{3}\.\d{4}

分别。我不太确定虚线检查的最后一个是否正确。我还想知道是否有什么方法可以编写单个表达式,而不是满足我提到的不同格式的4种不同表达式。如果是这样,我不确定该怎么做。以及如何修改表达式,以便我还可以包括一个条件来支持区号作为可选组件。就像是

+1 ### ### ####

其中+1是区号,并且是可选的。


5
可能是stackoverflow.com/questions/123559/…的重复项。建议的答案是剥离每个非数字字符。这样,您可以简化验证
Arnaud Denoyelle 2013年

1
我知道这已经有一段时间了,但是我认为美国区号不能以1开头。(123)456-7890由于前导1而无效
。– bobanahalf 2015年

有关更完整的正确答案,请参见:stackoverflow.com/a/18626090/561710
Joe Johnston

解析电话号码很困难。Google为此发布了一个开源库。
自助

Answers:


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

如果您不希望与非美国号码匹配,请使用

^(\+0?1\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$

更新:
正如下面的用户西蒙·韦弗(Simon Weaver)所注意到的,如果您还对匹配无格式数字感兴趣,只需将分隔符字符类设置为[\s.-]?

^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$

1
您是否认为第一行的(?\ d {3})部分不需要问号?我认为我们确实需要在'('和')'内出现一个或多个事件,而不是零或一个数字出现
noobcoder 2013年

2
?有适用于括号(),而不是数字。完整的相关正则表达式为\(?\d{3}\)?\d{3}指定()在(使)可选(按?)之间必须有三位数。
拉维·萨普利雅尔

6
注意:这与1234567890不匹配,这可能是问题,也可能不是问题。对我来说是-所以我只是说?每次使用后[\s.-],使之选
Simon_Weaver

1
@Simon_Weaver谢谢您的投入。我已经将您的观察结果添加到了答案中。
拉维·萨普利雅尔

3
如果您希望避免出现@BobRay的问题,请使用^(\+\d{1,2}\s)?((\(\d{3}\))|(\d{3}))[\s.-]\d{3}[\s.-]\d{4}$。(我基本上只是复制了RegEx的片段,该片段覆盖了区号,并允许一个变体带括号和一个不带变体)
Shrey Gupta

128

此问题可能有很多变体。这是一个正则表达式,类似于我之前放在SO上的答案。

^\s*(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\s*$

它将匹配以下示例以及更多示例:

18005551234
1 800 555 1234
+1 800 555-1234
+86 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
800 555 1234x5678
8005551234 x5678
1    800    555-1234
1----800----555-1234

无论输入电话号码的方式如何,捕获组都可以用于细分电话号码,以便您可以在代码中对其进行处理。

  • 组1:国家/地区代码(例如1或86)
  • 组2:区号(例如:800)
  • 组3:交易所(例如555)
  • 组4:订户编号(例如:1234)
  • 组5:分机(例如:5678)

如果您对此感兴趣,请按照以下说明进行细分:

^\s*                #Line start, match any whitespaces at the beginning if any.
(?:\+?(\d{1,3}))?   #GROUP 1: The country code. Optional.
[-. (]*             #Allow certain non numeric characters that may appear between the Country Code and the Area Code.
(\d{3})             #GROUP 2: The Area Code. Required.
[-. )]*             #Allow certain non numeric characters that may appear between the Area Code and the Exchange number.
(\d{3})             #GROUP 3: The Exchange number. Required.
[-. ]*              #Allow certain non numeric characters that may appear between the Exchange number and the Subscriber number.
(\d{4})             #Group 4: The Subscriber Number. Required.
(?: *x(\d+))?       #Group 5: The Extension number. Optional.
\s*$                #Match any ending whitespaces if any and the end of string.

要使区号为可选,只需在区号(\ d {3})后面添加问号。


7
最佳答案恕我直言。就我的目的而言,\s不需要在开头和结尾处使用,因为我正在使用它进行验证,并且该字段已被修剪。
丹尼尔(Daniel)

1
到目前为止,最佳答案和最完整的答案。我也非常感谢正则表达式的分解。
科比·杰克逊

@Kondal我很好奇您使用的输入使其失败。国家代码为0似乎对我来说很好用。
弗朗西斯·加农

<input type =“ text” name =“ phone_no” class =“ form-control” ng-pattern =“ ^ \ s *(?:\ +?(\ d {1,3}))?[-。(] *(\ d {3})[-。]] *(\ d {3})[-。] *(\ d {4})(?: * x(\ d +))?\ s * $“ -numbers ng-maxlength =“ 10” />
Kondal

@Kondal对不起。我的意思是您尝试匹配的文本与此正则表达式失败。
弗朗西斯·加农

8

^(\+\d{1,2}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$

匹配以下电话号码:

1-718-444-1122
718-444-1122
(718)-444-1122
17184441122
7184441122
718.444.1122
1718.444.1122
1-123-456-7890
1 123-456-7890
1 (123) 456-7890
1 123 456 7890
1.123.456.7890
+91 (123) 456-7890
18005551234
1 800 555 1234
+1 800 555-1234
+86 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
18001234567
1 800 123 4567
1-800-123-4567
+18001234567
+1 800 123 4567
+1 (800) 123 4567
1(800)1234567
+1800 1234567
1.8001234567
1.800.123.4567
+1 (800) 123-4567
18001234567
1 800 123 4567
+1 800 123-4567
+86 800 123 4567
1-800-123-4567
1 (800) 123-4567
(800)123-4567
(800) 123-4567
(800)1234567
800-123-4567
800.123.4567
1231231231
123-1231231
123123-1231
123-123 1231
123 123-1231
123-123-1231
(123)123-1231
(123)123 1231
(123) 123-1231
(123) 123 1231
+99 1234567890
+991234567890
(555) 444-6789
555-444-6789
555.444.6789
555 444 6789
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
(003) 555-1212
(103) 555-1212
(911) 555-1212
18005551234
1 800 555 1234
+86 800-555-1234
1 (800) 555-1234

参见regex101.com


7

这是我创建的一个相当紧凑的文件。

Search: \+?1?\s*\(?-*\.*(\d{3})\)?\.*-*\s*(\d{3})\.*-*\s*(\d{4})$

Replace: +1 \($1\) $2-$3

针对以下用例进行了测试。

18001234567
1 800 123 4567
1-800-123-4567
+18001234567
+1 800 123 4567
+1 (800) 123 4567
1(800)1234567
+1800 1234567
1.8001234567
1.800.123.4567
1--800--123--4567
+1 (800) 123-4567

这与(800 444-4444
Jake


4

为巴基斯坦用户尝试一下。这是我创建的一个相当紧凑的版本。

((\+92)|0)[.\- ]?[0-9][.\- ]?[0-9][.\- ]?[0-9]

针对以下用例进行了测试。

+92 -345 -123 -4567
+92 333 123 4567
+92 300 123 4567
+92 321 123 -4567
+92 345 - 540 - 5883

4

我使用的电话号码正则表达式: /^[+]?(\d{1,2})?[\s.-]?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/

盖子:

  • 18001234567
  • 1800 123 4567
  • +1 800 123-4567
  • +86 800 123 4567
  • 1-800-123-4567
  • 1(800)123-4567
  • (800)123-4567
  • (800)123-4567
  • (800)1234567
  • 800-123-4567
  • 800.123.4567

2

1、3和4的表达式非常相似,因此可以使用:

^([1-9]\d{2})([- .])(\d{3})$2(\d{4})$

请注意,根据所使用的正则表达式的语言和品牌,可能需要放置\2而不是,$2否则可能根本不支持此类匹配。

我看不到将其与格式2结合使用的好方法,除了显而易见^(regex for 1,3,4|regex for 2)$的丑陋,笨拙并且很难弄清数字的各个部分。

至于区号,您可以(\+\d)?在开头添加一个个位数的区号(很抱歉,我不知道您的区号的格式)。


2

这个怎么样?

^(\+?[01])?[-.\s]?\(?[1-9]\d{2}\)?[-.\s]?\d{3}[-.\s]?\d{4}

编辑:我忘记了()。编辑2:错误的前3位数部分。


.在字符类中时,无需转义点,因此[-\.\s]实际上应该为[-.\s],因为我们不想匹配反斜杠。
VedranŠego'13

它实际上会匹配反斜杠吗?我以为可能没有必要,但我不确定100%。
crimson_penguin

你是对的。我刚刚尝试过它(之前我从来不需要反斜杠),[\.]并且[.]两者都只匹配点,而同时[\\.]匹配点和反斜杠。谢谢您的发言。
VedranŠego'13

我对正则表达式的看法是,如果您要给某人提供正则表达式,请始终附上解释,否则正则表达式毫无价值。只是我的观点。
约翰·雷德

2

从@Ravi的答案开始,我还对NPA(区域)代码应用了一些验证规则

特别是:

  • 它应以2(或更高)开头
  • 它的第二和第三位数字(N11)不能为“ 11”。

还有其他一些限制,包括保留的块(N9X,37X,96X)和555,但我将那些保留在外,特别是因为保留的块可能会在将来使用,并且555对于测试非常有用。

这是我想出的:

^((\+\d{1,2}|1)[\s.-]?)?\(?[2-9](?!11)\d{2}\)?[\s.-]?\d{3}[\s.-]?\d{4}$

或者,如果您还想匹配空白值(如果不需要该字段),则可以使用:

(^((\+\d{1,2}|1)[\s.-]?)?\(?[2-9](?!11)\d{2}\)?[\s.-]?\d{3}[\s.-]?\d{4}$|^$)

我的有效数字测试用例(许多来自@Francis的答案)是:

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

我无效的测试用例包括:

(003) 555-1212     // Area code starts with 0
(103) 555-1212     // Area code starts with 1
(911) 555-1212     // Area code ends with 11
180055512345       // Too many digits
1 800 5555 1234    // Prefix code too long
+1 800 555x1234    // Invalid delimiter
+867 800 555 1234  // Country code too long
1-800-555-1234p    // Invalid character
1 (800)  555-1234  // Too many spaces
800x555x1234       // Invalid delimiter
86 800 555 1212    // Non-NA country code doesn't have +

我的正则表达式不包括提取数字组的分组,但可以对其进行修改以包括这些数字组。


2

也许最简单的一个与其他几个相比。

\(?\d+\)?[-.\s]?\d+[-.\s]?\d+

它符合以下条件:

(555)444-6789

555-444-6789

555.444.6789

555 444 6789


完美的人...谢谢(y)
Sushil Sharma

2

此代码将与美国或加拿大的电话号码匹配,并且还将确保它是有效的区号并进行交换:

^((\+1)?[\s-]?)?\(?[2-9]\d\d\)?[\s-]?[2-9]\d\d[\s-]?\d\d\d\d

在Regex101.com上测试


2

正则表达式可以验证常规的10位电话号码以及可选的国际代码(1至3位数字)和可选的分机号码(任意数字位数):

/(\+\d{1,3}\s?)?((\(\d{3}\)\s?)|(\d{3})(\s|-?))(\d{3}(\s|-?))(\d{4})(\s?(([E|e]xt[:|.|]?)|x|X)(\s?\d+))?/g

演示:https : //www.regextester.com/103299

有效条目:

/* Full number */
+999 (999) 999-9999 Ext. 99999

/* Regular local phone number (XXX) XXX-XXXX */
1231231231
123-1231231
123123-1231
123-123 1231
123 123-1231
123-123-1231
(123)123-1231
(123)123 1231
(123) 123-1231
(123) 123 1231

/* International codes +XXX (XXX) XXX-XXXX */
+99 1234567890
+991234567890

/* Extensions (XXX) XXX-XXXX Ext. XXX... */
1234567890 Ext 1123123
1234567890Ext 1123123
1234567890 Ext1123123
1234567890Ext1123123

1234567890 Ext: 1123123
1234567890Ext: 1123123
1234567890 Ext:1123123
1234567890Ext:1123123

1234567890 Ext. 1123123
1234567890Ext. 1123123
1234567890 Ext.1123123
1234567890Ext.1123123

1234567890 ext 1123123
1234567890ext 1123123
1234567890 ext1123123
1234567890ext1123123

1234567890 ext: 1123123
1234567890ext: 1123123
1234567890 ext:1123123
1234567890ext:1123123

1234567890 X 1123123
1234567890X1123123
1234567890X 1123123
1234567890 X1123123
1234567890 x 1123123
1234567890x1123123
1234567890 x1123123
1234567890x 1123123

1

我发现此正则表达式对于10位数的联系电话最有用:

^(?:(?:\+|0{0,2})91(\s*[\-]\s*)?|[0]?)?[789]\d{9}$

参考https : //regex101.com/r/QeQewP/1

说明:

在此处输入图片说明


您是否使用工具来生成该解释?分享!谢谢
未知

@unnknown看起来像来自在线正则表达式检查器(例如regex101.com)的屏幕截图。请注意,SO准则指出,所有文本,代码,数据和错误消息都必须以文本形式而不是图像形式输入,因为图像中的文本可能难以阅读,尤其是在移动设备上,并且占用更多带宽。文本也不能复制粘贴。在这种情况下,颜色可能会有所增加,不确定。要知道,“答案”通常应包括文字说明。阿米特什(Amitesh):包含指向本网站的链接会很有用,您的正则表达式已经填充,供访问者进行实验。
SherylHohman

@unnknown这是一个链接,其产生的图像类似于本文中的图像。Amitesh的正则表达式字符串已经粘贴。您可以输入电话号码以测试其结果:regex101.com/r/QeQewP/1
SherylHohman

0
^(\+1)?\s?(\([1-9]\d{2}\)|[1-9]\d{2})(-|\s|.)\d{3}(-|\s|.)\d{4}

0

这是一个更全面的版本,将尽可能地匹配我,并为您提供国家,地区,第一个和最后一个的组匹配。

(?<number>(\+?(?<country>(\d{1,3}))(\s|-|\.)?)?(\(?(?<region>(\d{3}))\)?(\s|-|\.)?)((?<first>(\d{3}))(\s|-|\.)?)((?<last>(\d{4}))))

0

用“ +”分隔多个数字又用“;”分隔它们怎么办?“,”“-”或“”字符?


0

我最终以

const regexBase = '(?:\\+?(\\d{1,3}))?[-. (]*(\\d{3})?[-. )]*(\\d{3})[-. ]*(\\d{4,5})(?: *x(\\d+))?'; const phoneRegex = new RegExp('\\s*' + regexBase + '\\s*', 'g');

例如,这是为了考虑荷兰数字

+358 300 20200


0

上面的正则表达式是对 @Francis Gagnon.

目标:检测用户可以共享其美国电话号码的任何可能的模式


版本1:

^\s*(?:\+?(\d{1,3}))?[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d[\W\D\s]*?\d)(?: *x(\d+))?\s*$

在这里测试Codepen:https://codepen.io/kiranbhattarai/pen/NWKMXQO

正则表达式的说明:https : //regexr.com/4kt5j


版本2:

\s*(?:\+?(\d{1,3}))?[\W\D\s]^|()*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d[\W\D\s]*?\d)(?: *x(\d+))?\s*$

内容是什么:测试用例可以是字符串的一部分。在第一个版本中,测试用例应该是工作的起点。

Codepen:https://codepen.io/kiranbhattarai/pen/GRKGNGG

正则表达式的说明:https : //regexr.com/4kt9n


如果您发现可能失败的模式,请发表评论,我会解决。

测试用例:通过

8 0   0  4  4  4  5   55 5
1 800 555 1234
+1 800 555-1234
+86 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
800 555 1234x5678
8005551234 x5678
1    800    555-1234
1----800----555-1234
800 (555) 1234
800(555)1234
8 0 0 5 5 5 1 2 3 4
8.0.0.5.5.5.1.2.3.4
8-0-0-5-5-5-1-2-3-4
(8)005551234
(80)05551234
8(00)5551234
8@0@0@5551234
8/0/0/5/5/5/1/2/3/4
8*0*0*5*5*5*1*2*3*4
8:0:0:5:5:5:1:2:3:4
8,0,0,5,5,5,1,2,3,4
800,555,1234
800:555:1234
1-718-444-1122
718-444-1122
(718)-444-1122
17184441122
7184441122
718.444.1122
1718.444.1122
1-123-456-7890
1 123-456-7890
1 (123) 456-7890
1 123 456 7890
1.123.456.7890
+91 (123) 456-7890
18005551234
1 800 555 1234
+1 800 555-1234
+86 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
18001234567
1 800 123 4567
1-800-123-4567
+18001234567
+1 800 123 4567
+1 (800) 123 4567
1(800)1234567
+1800 1234567
1.8001234567
1.800.123.4567
+1 (800) 123-4567
18001234567
1 800 123 4567
+1 800 123-4567
+86 800 123 4567
1-800-123-4567
1 (800) 123-4567
(800)123-4567
(800) 123-4567
(800)1234567
800-123-4567
800.123.4567
1231231231
123-1231231
123123-1231
123-123 1231
123 123-1231
123-123-1231
(123)123-1231
(123) 123-1231
(123) 123 1231
+99 1234567890
+991234567890
(555) 444-6789
555-444-6789
555.444.6789
555 444 6789
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
(003) 555-1212
(103) 555-1212
(911) 555-1212
18005551234
1 800 555 1234
+86 800-555-1234
1 (800) 555-1234

+ 86,+ 99等绝对不是美国的电话号码。由于其他原因,您的其他几个测试用例看起来也令人怀疑。
Tripleee

@tripleee让我修复此问题,我已将其更新到我希望它能运行的任何国家。另外,我也删除了重复的测试用例
Kiran Bhattarai

0

我只是把这个答案放在那里,因为它解决了我的问题,它基于@stormy的答案,但是包含3位数的国家/地区代码,更重要的是可以在字符串中的任何地方使用,但是不会匹配,因为不是前面以空格/字符串开头,以单词边界结尾。这很有用,这样它就不会与网址中间的随机数匹配

((?:\s|^)(?:\+\d{1,3}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4})(?:\b)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.