匹配电话号码的正则表达式

3
我需要一个正则表达式来匹配电话号码。我只想知道这个号码可能是不是一个电话号码,它可以是任何电话格式,美国或国际。因此,我制定了一种策略来确定是否匹配。
我希望它接受以下字符:0-9以及,.()-,并且可选地以+(用于国际号码)开头。如果字符串中有任何其他字符,则不应该匹配。
我尝试了这个:
/\+?[0-9\/\.\(\)\-]/

但它会匹配将“+”号放在号码中间的电话号码。而且它会匹配包含字母字符的数字(我不想要那样的)。

最后,我想将最小长度设置为9个字符。

有什么想法吗?

谢谢任何帮助,显然我对正则表达式还不太熟练 :)


很不幸,仅允许输入有效电话号码的数字在国际上非常麻烦。国际号码的长度和格式差异很大。但是,像下面他所做的那样,可以要求输入9位或更多位数的号码。 - m4tt1mus
可能是A comprehensive regex for phone number validation的重复问题。 - mmmmmm
3个回答

4

好的,你很接近了。试试这个:

^\+?[0-9\/.()-]{9,}$

没有起始和结束锚点,您允许部分匹配,因此它可以从字符串:-)+123中匹配+123
如果您想要至少9个数字,而不是任何字符(因此---...///无效),您可以使用:
^\+?[\/.()-]*([0-9][\/.()-]*){9,}$

或者,使用预查 - 在匹配字符串[0-9/.()-]*之前,正则表达式引擎正在查找(\D*\d){9},其中包含9个数字,每个数字可能在其他字符之前(我们稍后将验证)。
^\+?(?=(\D*\d){9})[0-9\/.()-]*$

1
+1 这确实回答了问题中提到的标准。国际电信联盟定义电话号码的标准可能值得一提:http://zh.wikipedia.org/wiki/E.164 - msw
注意 - 您可能需要使用 \/ 转义斜杠 - 我看到了 .net 标签,所以我没有包含它。实际上,为了安全起见,我会添加它。 - Kobi
这实际上不会起作用,因为您没有正确转义 () / 或 .。至少在我使用的语言中不会起作用。尽管语法是正确的。 - m4tt1mus
@mattimus - 你在测试哪种口味?通常在字符类中不需要转义它们。这里有一个例子:http://rubular.com/r/TrNUkWUiyT 一些语言还需要转义 /,我已经在12分钟前编辑到答案中 :) - Kobi
我最终得到了 /^+?[ /.,()-]([0-9][ /.,()-]){9,}$/。谢谢! - phil swenson

1

它匹配字母字符的原因是因为句点。你必须对其进行转义。我不知道你在使用什么编辑器,这是我在VIM中使用的:

^+\?[()\-\.]\?\([0-9][\.()\-]\?\)\{3,\}$

恐怕那不是真的。在字符类([.])中,您不必转义点。此外,在正则表达式中,您不应该转义 ?{},但应该转义 + - Kobi
你关于点转义的说法是正确的,但是我必须在VIM中转义?、{和}。我不知道你们用什么来编写正则表达式,所以我只是根据我的VIM知识提供了建议。 - nikeairj
非常有趣的变化 - 一开始似乎相反,但确实是有道理的。 - Kobi

0

Juqeury有一个用于美国电话验证的插件。请查看link。您还可以在源代码中查看正则表达式。


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