我试图把一个全面的正则表达式放在一起来验证电话号码。理想情况下,它可以处理国际格式,但它必须处理美国格式,包括以下内容:

1-234-567-8901 1-234-567-8901 x1234 1-234-567-8901 ext1234 1 (234) 567-8901 1.234.567.8901 1/234/567/8901 12345678901

我会用我目前的尝试来回答,但我希望有人有更好的和/或更优雅的东西。


当前回答

我也在为同样的问题而挣扎,试图让我的应用程序经得起未来的考验,但这些人让我走上了正确的方向。我实际上并不是在检查数字本身,看它是否有效,我只是试图确保输入的一系列数字可能有或没有扩展名。

最坏的情况是,如果用户必须从XML文件中提取一个未格式化的数字,他们仍然只是将数字输入到手机的数字pad 012345678x5中,没有真正的理由保持它的美观。这种RegEx对我来说是这样的:

\d+ ?\w{0,9} ?\d+

01234467分机号123456 01234567 x123456 01234567890

其他回答

这是我目前为止最好的尝试。它处理上面的格式,但我确信我错过了一些其他可能的格式。

^\d?(?:(?:[\+]?(?:[\d]{1,3}(?:[ ]+|[\-.])))?[(]?(?:[\d]{3})[\-/)]?(?:[ ]+)?)?(?:[a-zA-Z2-9][a-zA-Z0-9 \-.]{6,})(?:(?:[ ]+|[xX]|(i:ext[\.]?)){1,2}(?:[\d]{1,5}))?$
    pattern="^[\d|\+|\(]+[\)|\d|\s|-]*[\d]$" 
    validateat="onsubmit"

必须以数字结尾,可以以(或+或数字开头,并且可以包含+ -(或)

你看过RegExLib了吗?

输入一个美国的电话号码,你会发现很多可能性。

下面是一个在JavaScript中运行良好的例子。它在一个字符串中,因为这是Dojo小部件所期望的。

它匹配10位北美NANP号码可选扩展。空格、破折号和句号是可接受的分隔符。

"^(\\(?\\d\\d\\d\\)?)( |-|\\.)?\\d\\d\\d( |-|\\.)?\\d{4,4}(( |-|\\.)?[ext\\.]+ ?\\d+)?$"

你会很难用一个简单的正则表达式处理国际号码,看看这篇关于国际(甚至北美)电话号码的困难的文章。

您需要解析前几位数字以确定国家代码,然后根据国家采取不同的操作。

除此之外——你给出的列表不包括另一种常见的美国格式——省略了首字母1。在美国,大多数手机都不需要这种功能,这将开始困扰年轻一代,除非他们拨打国际长途电话。

你已经正确地认识到这是一个棘手的问题。

亚当