2016-05-31 223 views
1

我有一堆我想分析的数字。正则表达式匹配不同格式的电话号码

+79261234567 
89261234567 
79261234567 
9261234567 
+7 926 123 45 67 
8(926)123-45-67 
123-45-67 
79261234567 
(495)1234567 
(495) 123 45 67 
89261234567 
8-926-123-45-67 
8 927 1234 234 
8 927 12 12 888 
8 927 12 555 12 
8 927 123 8 123 

我来到第一处是什么,通过这样

(\+[\d]{11}|[\d]{10,11}|\+\d\ [\d]{3}\ [\d]{3}\ [\d]{2}\ [\d]{2}|\d\([\d]{3}\)[\d\-]{9}|[\d\ ]{14,15}|[\d\-]{14,15}|[\d\-]{9}|\(\d\d\d\)[\d\-]{9,10}|\(\d\d\d\)[\d\ ]{9,10}|\(\d\d\d\)[\d\-]{7}) 

所有变种周期是否有更优雅的方式来匹配这些数字呢?

+2

试图捕捉某种可能的方式来记录某个电话号码并不是很优雅,所以我想这里也没有优雅的正则表达式。 –

+0

我只是检查字符串是否包含最小位数,并让用户输入他的电话号码;) –

+0

我同意。为什么不从你的输入中除去数字和加号('[^ + 0-9] +'“),然后解析剩下的内容? –

回答

0

此正则表达式将匹配所有的例子并没有太多额外的:

[+]?(\b\d{1,2}[ -]?)?([(]?\d{3}[)]?)((?:[ -]?\d){4,7})(?![ -]?\d) 

它可以包含7到12位数字。

尽管还是会匹配这样的事情:

+12 (345) 6-7-8 9-0-1 

但应该是在可接受的范围之内。

但是,那个人仍然可以匹配一个更长的数字的一部分。
并避免它需要一些负面的后视。
(注意,有在JavaScript正则表达式没有查找屁股)

[+]?(?<!\d)(?<!\d[ -])(?:((\d{1,2}[ -]?)?[(]?\d{3}[)]?[ -]?)(\d(?:[ -]?\d){3,6}))(?![ -]?\d) 

下面是这最后一个regex101 test

+1

在字符类中放入'\ d'打开了数字完全非数字并以数字结尾的能力。如'------ 2' – 4castle

+0

@ 4castle好点。 :)我添加了一个警告。 – LukStorms

+0

对于大多数国际号码和超过2个号码的代码,这一个将会失败。例如。 +493025554433,+330140205317等 – SublimeYe

0

要有一个更优雅的解决方案,你将不得不使模式更放松。一种选择是捕捉7,10,或11个数字由0或多个分隔符分开:

\+?(?:[()-]*\d){10,11}|(?:[()-]*\d){7} 

Regex101 Tested

+0

这是一种踢在路上的罐头虽然..当它是一个8位数字,或14?你最终会在OP现在处于相同的情况下,只是将OR'放在一起放宽长度正则表达式。 – CDahn

+0

@CDahn他们可以说7个或更多的数字然后:'\ +?(?:[() - ] * \ d){7,}' – 4castle

+0

是的,但我认为原文的精神是为了确定格式。尽管OP没有这样说,但我认为他真正想要的是验证国家代码等。如果您只是想确定您有10个数字,那么我肯定会同意您的正则表达式是正确的方式去做吧,但肯定他不能这么说......对吗? :-) – CDahn