正则表达式匹配不同格式的电话号码
问题描述:
我有一堆我想分析的数字。正则表达式匹配不同格式的电话号码
+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})
所有变种周期是否有更优雅的方式来匹配这些数字呢?
答
此正则表达式将匹配所有的例子并没有太多额外的:
[+]?(\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。
答
要有一个更优雅的解决方案,你将不得不使模式更放松。一种选择是捕捉7,10,或11个数字由0或多个分隔符分开:
\+?(?:[()-]*\d){10,11}|(?:[()-]*\d){7}
试图捕捉某种可能的方式来记录某个电话号码并不是很优雅,所以我想这里也没有优雅的正则表达式。 –
我只是检查字符串是否包含最小位数,并让用户输入他的电话号码;) –
我同意。为什么不从你的输入中除去数字和加号('[^ + 0-9] +'“),然后解析剩下的内容? –