正则expression式匹配标准的10位电话号码

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

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

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

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

分别。 我不太确定最后一张是否适用于虚线检查。 我也想知道是否有任何方法可以写出一个单一的expression式,而不是四个不同的expression式来迎合我提到的不同格式。 如果是这样,我不知道我该怎么做。 另外,如何修改expression式/expression式,以便我还可以包含支持区域代码作为可选组件的条件。 就像是

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

+1是区号,它是可选的。

 ^(\+\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.-]?可选[\s.-]?

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

这个问题有很多可能的变化。 这是一个类似于我以前在SO上的答案的正则expression式。

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

无论input电话号码的方式如何,都可以使用捕获组对电话号码进行分类,以便在代码中对其进行处理。

  • 组1:国家代码(例如1或86)
  • 组2:地区代码(例如:800)
  • 第3组:交换(例如:555)
  • 组4:用户号码(例如:1234)
  • Group5:Extension(例如:5678)

如果你感兴趣,下面是expression式的细分:

 ^\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})后面加一个问号即可。

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

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

针对以下用例进行testing。

 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 

1,3和4的expression式非常相似,所以可以使用:

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

请注意,根据使用的正则expression式的语言和品牌,您可能需要放置\2而不是$2否则这种匹配可能根本不受支持。

除了显而易见的^(regex for 1,3,4|regex for 2)$这是丑陋的,笨拙的,并且使得难以摆脱数字的部分,我没有看到将它与格式2结合的好方法。

至于地区代码,您可以添加(\+\d)? 到开始捕捉一位数的区号(抱歉,我不知道你的区号的格式)。

这个怎么样?

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

编辑:我忘了()一个。 编辑2:得到错误的第一个3位数的部分。

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

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

针对以下用例进行testing。

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

在jsfiddle上添加一个使用上面提到的解决scheme的例子。 根据我的客户要求,我修改了一些代码。 希望这也能帮助别人。

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

请看这里的例子

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

从@ Ravi的回答开始,我也对NPA(区域)代码应用了一些validation规则 。

尤其是:

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

还有一些其他的限制,包括保留块(N9X,37X,96X)和555,但是我把这些保留了下来,特别是因为保留块可能会被使用,555对于testing是有用的。

这就是我想到的:

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

我的有效数字的testing用例(许多来自@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 

我的无效testing用例包括:

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

我的正则expression式不包括分组来提取数字组,但可以修改它以包含这些数字组。

这是一个更全面的版本,将尽可能匹配,以及给你的国家,地区,第一,最后的组匹配。

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

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

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

它匹配以下内容:

(555)444-6789

555-444-6789

555.444.6789

555 444 6789

多个数字用“+”分开,用“+”分隔。 “,” – “或”“字符?