2016-05-31 3 views
1

У меня есть куча чисел, которые я хочу разобрать.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-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

Этот номер не подходит для большинства международных номеров с кодом, который содержит более двух цифр. Например. +493025554433, +330140205317 и т. Д. – SublimeYe

0

Чтобы иметь более элегантное решение, вам придется сделать шаблон более расслабленным. Одним из вариантов является захват 7, 10 или 11 числа, разделенных 0 или более разделителей:

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

Regex101 Tested

+0

Это вроде бы ногами по дороге вниз. Что происходит, когда это 8-значное число или 14? В итоге вы окажетесь в той же ситуации, в которой находится OP, только с OR'ing вместе с расслабленными длинными регулярными выражениями. – CDahn

+0

@CDahn Они могли бы просто сказать 7 или более цифр: '\ +? (?: [() -] * \ d) {7,}' – 4castle

+0

Да, но я думаю, что дух оригинального поста - это проверка определенных форматы. Хотя ОП не сказал этого, я думаю, что он на самом деле хочет, чтобы проверить коды стран и т. Д. Если вы просто пытаетесь определить, что у вас есть 10 номеров, то я определенно соглашусь с тем, что ваше регулярное выражение - это правильный способ пойдите, но, конечно, он не может этого сказать. Правильно? :-) – CDahn

Смежные вопросы