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

时间:2016-05-31 13:21:45

标签: regex

我有一堆我要解析的数字。

+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或更多分隔符分隔的7,10或11个数字:

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

Regex101 Tested

答案 1 :(得分: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