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

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

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


当前回答

Find String regex = "^\\+(?:[0 - 9] ?){6、14}[0 - 9]美元”;

对国际号码很有用。

其他回答

这里有一个非常棒的模式,它最接近我需要实现的验证。我不是原作者,但我认为这很值得分享,因为我发现这个问题非常复杂,没有一个简明或广泛有用的答案。

下面的正则表达式将捕获各种全球电话号码格式中广泛使用的数字和字符组合:

/ ^ \ s * (?: \ + ? (\ d{1,3})) ?([-。() * (\ d{3})(-)。) *) ? ((\ d{3})[-。) * (\ d{2,4})(?:[-。x] * (\ d +)) ?) \ s *美元/通用

正面: + 42 555.123.4567 -123-4567 + 1 - (800) 电话:+7 555 1234567 + 7 (926 1234567) (926 1234567) + 79261234567 926 1234567 9261234567 1234567 123-4567 123-89-01 495 1234567 469 123 45 67 89261234567 8 (926) 1234567 926.123.4567 415-555-1234 650-555-2345 (416) 555-3456 202 555 4567 4035555678 1 416 555 9292

负面: 926 3 4 8 800 600个苹果

原始来源:http://www.regexr.com/38pvb

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

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

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

我相信Number::Phone::US和Regexp::Common(尤其是Regexp::Common::URI::RFC2806的源代码)Perl模块会有所帮助。

应该更详细地说明这个问题,以解释验证这些数字的目的。例如,911在美国是一个有效的号码,但911x不是x的任何值,这样电话公司就可以计算出你什么时候拨号。关于这个问题有几种不同的说法。但是您的正则表达式不检查区域代码部分,因此这似乎不是一个问题。

就像验证电子邮件地址一样,即使你有一个有效的结果,你也无法知道它是否分配给了某人,直到你尝试它。

如果您正在尝试验证用户输入,为什么不规范化结果并处理它呢?如果用户输入的数字您不能识别为有效数字,则将其保存为输入值或删除不可用字符。Number::Phone::Normalize Perl模块可能是灵感的来源。

我写得最简单(虽然我不需要点)。

^([0-9\(\)\/\+ \-]*)$

正如下面提到的,它只检查字符,而不检查其结构/顺序