如何使用正则表达式验证电话号码?

5

在我的练习中,我需要验证电话号码,正确的电话号码是:

1234567890
123-456-7890
123.456.7890
(123)456-7890
(123) 456-7890
456-7890

我尝试了[(]?[0-9][0-9][0-9][).-]? ?[0-9][0-9][0-9][.-]?[0-9][0-9][0-9][0-9],但这样似乎也接受像(123.456-7890这样的东西。我该如何处理?或者需要用完全不同的方法?

以下是一些无效的电话号码:

123-45-6789
123:4567890
123/456-7890

3
你应该展示不正确的情况,否则 .* 将是一个正确的答案。 - Bohemian
啊,我以前也曾经遇到过这个问题。清晰地概述正确和错误的输入集合是个好主意(例如,我注意到你可以混合使用空格和破折号分隔符,但不能使用点号和括号?) - Anti Earth
@ashur,我相信我符合你的所有要求。我编辑了我的帖子,并尽可能详细地解释了。希望有所帮助。 - Steve P.
你的问题的被接受的答案已经被标记为重复,正则表达式无法解决它。请看一下我的解决方案。我已经测试了所有你在其他解决方案中发现的通过的负面测试用例。 - Ravi K Thapliyal
3个回答

0
尝试使用前瞻来匹配括号和其他平衡检查,示例代码如下:
^(?:((?=\(.*\).*\-)|(?!.*\()(?!.*\)))\(?[0-9]{3}\)?(((?<=[)])|[\-\s])(?=.*\-)|\.(?=.*\.)|(?<=^)|(?=[0-9]+$)))?[0-9]{3}[\s.-]?[0-9]{4}$

或者这个 (使用\d,因为这是我参加最短正则表达式大游行的竞争者)

^((\d{3}-|\(\d{3}\)\s?)?\d{3}-|^\d{3}(\.)?\d{3}\3)\d{4}$

我更喜欢使用\d而不是[0-9]。编辑得很好。 - Java Devil
@JavaDevil 是的,我也是这样认为。问题在于\d也可以匹配Unicode数字。如果这不是一个问题,使用\d的正则表达式肯定会更漂亮 :) - acdcjunior
等等,这个程序也能处理数字之间分隔符必须一致的尴尬情况吗?我觉得这是这个问题的挑战性所在... - aug
2
@acdcjunior - 如果这已经算漂亮了,我宁愿不看丑的... - jahroy
@ashur,你试过这个最新版本吗? - acdcjunior
显示剩余6条评论

-1

这个模式适用于您的示例,我将其编写为不带Java转义符的形式:

 ^(?>\(\d{3}\) ?|\d{3}[.-]?)?\d{3}[.-]?\d{4}$

解释:

 ^                 begining  of the string
 (?>               open an atomic group
    \(\d{3}\) ?    3 digits with parenthesis followed by a space or not
   |               OR
    \d{3}[.-]      3 digits followed by . or - or not
 )                 close atomic group
 ?                 the atomic group is optional
 \d{3}             3 digits
 [.-]?             followed by a . or a - (optional)
 \d{4}             4 digits
 $                 end of the string         

-1

正则表达式

^\d{10}|^(\(\d{3}\)\s?)?\d{3}-\d{4}$|^\d{3}([.-])\d{3}\2\d{4}$

匹配以下内容

1234567890
123-456-7890
123.456.7890
(123)456-7890
(123) 456-7890
456-7890

不匹配

123-45-6789
123:4567890
123/456-7890
(123-456-7890
123.456-7890
(123)456.7890

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