2015-08-05 2 views
1

Я пытаюсь сопоставить номера телефонов. Кажется, что это нормально для многих случаев, но по какой-то причине это не срабатывает. Я не могу понять, почему.Регулярное выражение для соответствия номеру телефона

Выкройка:

/^(\d)?[^\d]*?(\d{3}).*?(\d{3}).*?(\d{4}).*(\d{0,6}).*/ 

значение Телефон:

4012538900 (227) 

Это не соответствует 227 по какой-то причине. Если я изменю свой \d{0,6} на \d{3}, кажется, все в порядке, с использованием диапазона \d{1,x} (x> 1). Это, конечно же, нарушит мои другие ценности, поэтому это не решение.

RegEx101 Demo.

ответ

1

Вы можете использовать это регулярное выражение, чтобы исправить вашу проблему:

^(\d)?\D*?(\d{3})\D*(\d{3})\D*(\d{4})\D*(\d{0,6}) 

Updated RegEx Demo

Избегайте использования .* в своем регулярном выражении, так как он также может потреблять ваши цифры, лучше использовать \D* для согласования нецифровые.

+0

Спасибо, это действительно лучше, и я буду использовать его вместо этого. Мне все равно хотелось бы знать, почему регулярное выражение не соответствует моему шаблону. – PenguinSource

+0

первый. * Matches "(", \ d {0,6} должен соответствовать 227, а второй. * Должен соответствовать ")". Я понимаю, что использование цифр (^ D) лучше, и я буду использовать это с этого момента. И я понимаю. * Я потребляю свои цифры, но почему он это делает, а не соответствует \ d – PenguinSource

+1

Нет, @PenguinSource, это не то, что он будет делать. Для '. * (\ D {0,6}). * /', Первая '. *' Будет соответствовать остальной части строки, потому что она жадна. Тогда '(\ d {0,6})' будет соответствовать 0 цифрам, а затем '. *' Будет соответствовать 0 символам. – DavidS

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