188

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

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

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

^[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 是区号,它是可选的。

4

21 回答 21

304
^(\+\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}$
于 2013-05-22T18:52:14.500 回答
188

这个问题可能有很多变化。这是一个类似于我之前放在 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

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

  • Group1:国家代码(例如:1 或 86)
  • Group2:区号(例如:800)
  • Group3:交易所(例如:555)
  • Group4:订户号码(例如:1234)
  • Group5:分机(例如: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}) 后添加一个问号即可。

于 2013-05-22T23:03:15.793 回答
29

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

于 2019-06-04T20:28:24.630 回答
13

用于验证常规 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
于 2018-05-01T19:38:41.870 回答
9

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

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
于 2014-11-25T16:06:31.533 回答
6

在 jsfiddle 上使用上述解决方案添加一个示例。我根据客户的要求对代码进行了一些修改。希望这也对某人有所帮助。

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

请参阅此处的示例

于 2016-10-28T11:35:18.463 回答
6

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

盖子:

  • 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
于 2018-08-31T20:00:38.223 回答
5

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

((\+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
于 2016-03-14T19:06:46.137 回答
4

从@Ravi 的回答开始,我还对 NPA (Area) Code 应用了一些验证规则

尤其:

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

还有其他一些限制,包括保留块(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 +

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

于 2016-07-28T22:24:02.187 回答
2

这个怎么样?

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

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

于 2013-05-22T18:35:51.450 回答
2

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

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

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

除了明显^(regex for 1,3,4|regex for 2)$的丑陋、笨拙并且很难找出数字的一部分之外,我认为没有将它与格式 2 结合起来的好方法。

至于区号,您可以(\+\d)?在开头添加捕获一位数的区号(对不起,我不知道您的区号格式)。

于 2013-05-22T18:36:41.620 回答
2

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

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

它匹配以下内容:

(555) 444-6789

555-444-6789

555.444.6789

555 444 6789

于 2016-11-18T20:55:40.353 回答
2

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

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

在 Regex101.com 上测试

于 2018-03-30T14:56:56.813 回答
2

我发现这个正则表达式对我来说最有用的 10 位联系号码:

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

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

解释:

在此处输入图像描述

于 2018-09-05T13:06:23.507 回答
1

上面的正则表达式是对 @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*$

内容:测试用例可以是字符串的一部分。在第一版中,测试用例应该是工作的开始。

代码笔: 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
于 2019-09-12T16:47:18.950 回答
1

我只是把这个答案扔在那里,因为它解决了我的一个问题,它基于@stormy 的答案,但包括 3 位国家代码,更重要的是可以在字符串中的任何地方使用,但不匹配是不是前面是空格/字符串的开头,并以单词边界结尾。这很有用,因此它不会匹配 URL 或其他东西中间的随机数

((?:\s|^)(?:\+\d{1,3}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4})(?:\b)
于 2019-11-08T21:09:32.857 回答
0
^(\+1)?\s?(\([1-9]\d{2}\)|[1-9]\d{2})(-|\s|.)\d{3}(-|\s|.)\d{4}
于 2013-05-22T18:44:25.277 回答
0

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

(?<number>(\+?(?<country>(\d{1,3}))(\s|-|\.)?)?(\(?(?<region>(\d{3}))\)?(\s|-|\.)?)((?<first>(\d{3}))(\s|-|\.)?)((?<last>(\d{4}))))
于 2016-08-16T16:54:06.883 回答
0

用“+”将多个数字用“;”分隔怎么办?"、"-" 或 " " 字符?

于 2017-11-06T07:16:37.783 回答
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

于 2018-06-21T14:01:53.797 回答
0

这是一个匹配北美号码以及中东等国际号码的正则表达式。

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

于 2022-02-13T02:46:19.763 回答