Regex работает неправильно, сопоставляя неожиданные вещи
У меня есть это регулярное выражение:
[\(\+\[]?[0-9]([\-\)\.\/-\]]?\s?\(?[0-9\s\)]){8,20}?
Он должен соответствовать только телефонным номерам, но вместо этого он также должен соответствовать таким вещам, как:
[95.86.22.137]
95.86.22.137
(192.168.1.94)
274.1363525390625px;">
2014-8-720:32:45
Может кто-нибудь помочь мне исправить это регулярное выражение, пожалуйста?
1 ответ
Если вы действительно хотите сделать это правильно, я бы начал сначала и установил шаблон, которому вы хотите соответствовать, что не видно по вашему регулярному выражению и не было в вашем вопросе - только то, что вы не хотели. Вы должны смотреть на это как "что я хочу?", А не "что я пытаюсь исключить?". Сделайте это как "что я хочу?" и то, что вам нужно, устранит все эти неприятные другие возможности.
Сначала вы должны решить, что вы примете в качестве "действительного номера телефона". Помните, что даже в рамках NANP (Североамериканский план нумерации) есть несколько различных форматов, которые выглядят следующим образом:
- XXX-XXX-XXXX или
- XXX XXX-XXXX или
- 1-XXX-XXX-XXXX или
- (XXX) XXX-XXXX или
- +(XXX) XXX-XXXX или
- 1 (XXX) XXX-XXXX
И все это действительные числа, поэтому вам нужно будет выбрать формат, который вы примете. Кроме того, в остальном мире существуют различные форматы различной длины от 9 (Португалия) до 13 (Южная Корея) цифр, включая код страны и международный код. Итак, вы должны решить:
- Будете ли вы принимать только номера NANP или другие номера за пределами этого стандарта?
- Вы примете "+" или заставите их написать международный код? Будет ли код для стран, которые будет вводить ваш пользователь, иметь заданное количество цифр, если вам требуется код? Если они введут код, сможет ли ваше регулярное выражение обработать (если это приемлемо) или пометить красным (если не приемлемо) это?
- Будете ли вы применять круглые скобки вокруг кода зоны, просто позволите им (сделать скобки необязательными) или прямо откажетесь от них?
Что касается последнего, обратите внимание, что в разных странах в скобках указаны номера в разных местах, т. Е. В Мексике есть 2-значные коды городов (между прочим, их нет в NANP).
И помните, что каждый раз, когда вы принимаете решения такого рода, которые требуют какого-то символа, вы отрицаете другие возможные действительные номера телефонов, если только вы не допустили и другие допустимые символы в этом слоте. Вот почему не существует единого решения для всех ваших проблем. По этой причине многие скажут вам просто убрать "+", "(", ")", "-", а затем посчитать цифры. Но это терпит неудачу, если вы считаете, что "1" в номере NANP является обязательным, но кто-то не включает его (потому что это обычно необязательно в NANP), или когда разные страны имеют разные цифры в своих числах - даже в пределах их собственная страна, как Новая Зеландия.
Существует так называемое всеобъемлющее руководство: всеобъемлющее регулярное выражение для проверки номера телефона
Но я обнаружил, что ему ужасно не хватает таких вещей, как заставить человека вводить "+" против "1" и пробел (для чисел NANP), как применять скобки, дефисы и т. Д. Это дает вам регулярные выражения вместо объяснения как тебя туда добраться. Отсюда и мой "блог", здесь, для ответа.
Вот мое строгое регулярное выражение NANP, которое я принимаю:
- +(XXX) XXX-XXXX
- 1 (XXX) XXX-XXXX
- (XXX) XXX-XXXX
Это требует скобок и дефиса, который, как я полагаю, для номеров NANP дает большую гибкость при сохранении соответствия стандарту. К счастью, я не имею дело с международными (за пределами NANP) номерами:
/^(\+|1\s)?[(][2-9]\d{2}[)][\s][2-9]\d{2}-\d{4}$/
/^
= Совпадение в начале слова; в основном просто указывает на начало выражения
(\+|1\s)? группа
- Скобки используются для смещения группы и говорят, что любой из символов внутри является необязательным, через
?
в конце и разрешить условие "или" внутри (см. символ трубы) \+
= Экранированный "+", чтобы разрешить сопоставление со знаком плюс (необходимо экранировать, так как он является ключевым символом в регулярном выражении, используя обратную косую черту)|
= Символ трубы, чтобы сказать, что он должен совпадать с тем, что слева или справа, внутри группы1\s
= Требуется число 1 и пробел. Пространство не требуется[]
- это не сработало для меня, хотя я видел другие посты, которые, кажется, указывают на это. это\s
,
[(]
= Так вы указываете, что открывающая скобка обязательна.
[2-9] \ d {2} группа
[2-9]
= Это для того, чтобы выражение совпадало с цифрой 2-9. Это связано с тем, что в NANP 0 и 1 являются недопустимыми номерами в начале кода города (первый набор из 3 номеров) или в телефонной станции (второй набор из 3 номеров).\d{2}
= Это говорит о том, чтобы разрешить 2 цифры, от 0 до 9. Это сокращение для[0-9][0-9]
,
Для группы из трех цифр 000-999 вы бы просто сказали: \d{3}
[)]
= Так вы указываете, что закрытые скобки обязательны.
[\s]
= Это потребует пробела.
[2-9] \ d {2} - \ d {4} группа
- Эта первая часть, перед дефисом, такая же, как и раньше.
- Установка дефиса потребует этого, здесь. Если вы положите
-?
было бы необязательно. \d{4}
= Это говорит, что разрешено 4 цифры, от 0 до 9. Это сокращение для[0-9][0-9][0-9][0-9]
$/
= Говорит, чтобы соответствовать до конца слова; в основном просто указывает на конец выражения.
Надеюсь, это поможет вам построить свое выражение.