用正则表达式验证美国电话号码?

55

可能是重复问题:
一个全面的用于验证电话号码的正则表达式
使用JavaScript验证电话号码

我想编写一个正则表达式来验证格式为 (123)123-1234 或 123-123-1234 的美国电话号码,这两种格式都是合法的。

其他任何形式都是无效的。

我已经想出了以下正则表达式:

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

但是这个是合法的, 123)-123-1234 (123-123-1234

这是不正确的。


16
我认为让人们以任何方式输入他们的电话号码更为友好。只需过滤掉非数字字符,并确保剩下10个数字即可。 - Pointy
1
这可能是一个重复的问题,但在标记帖子之前,请链接到先前的答案。 - mindtonic
1个回答

90

匹配两者的最简单方法

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

^[0-9]{3}-[0-9]{3}-[0-9]{4}$

使用alternation((...|...)):将它们指定为两个大部分分开的选项:

^(\([0-9]{3}\)|[0-9]{3}-)[0-9]{3}-[0-9]{4}$

顺便提一下,当美国人将区号放在括号中时,实际上我们会在其后加一个空格;例如,我会写成(123) 123-1234,而不是(123)123-1234。因此,您可能需要这样写:

^(\([0-9]{3}\) |[0-9]{3}-)[0-9]{3}-[0-9]{4}$

(尽管最好明确地展示您期望的电话号码格式。)


1
以上表达式对于(000) 000-0000是成功的,我们如何避免这种情况? - HaBo
5
为什么我们要避免那种情况? - ruakh
5
因为这不是一个有效的电话号码。 - HaBo
35
正则表达式无法检测“有效”的电话号码,只能检查“格式正确”的电话号码。但是,需要注意的是,在美国没有区号以0或1开头,因此如果需要,可以将初始的[0-9]{3}更改为[2-9][0-9][0-9]。 - ruakh
11
@joaquin:你犯了一个错误!区号的三个数字都不能包含0或1,这意味着所有洛杉矶和纽约市的电话号码都将被拒绝!(310和212) - FlorianB
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接