Типичное регулярное выражение для проверки номера телефона в Java

#regex #phone-number

#регулярное выражение #телефонный номер

Вопрос:

Я изо всех сил пытаюсь получить правильное регулярное выражение для проверки номера телефона в моем приложении. У меня есть регулярное выражение, которое будет принимать только цифры и некоторые специальные символы, такие как ()- etc, однако проблема в том, что оно также принимает только символы. Так, например, оно будет принимать что-то вроде ()()()() . Я хочу изменить регулярное выражение или получить совершенно новое регулярное выражение, которое принимает эти символы, но оно должно содержать хотя бы одно число до и после каждого символа.

Мои требования:

  1. Только номера
  2. Номер с комбинацией специальных символов
  3. За каждым символом должно следовать число (до и после), но пробелы допустимы
  4. Максимальная длина должна быть 15

Комментарии:

1. Существуют допустимые телефонные номера длиной более 15 цифр, особенно международные. А как насчет extensions ( ... x123 ) ?

2. Нет, я не хочу обрабатывать расширение. И допустимая длина составляет всего 15 для моего приложения. В настоящее время я использую это регулярное выражение. ^ *[0-9()- ]*$ , как я могу сделать номер обязательным здесь? В настоящее время поддерживаются только специальные символы ()- .

3. Достаточно справедливо. Я не предлагаю вам обрабатывать международные телефонные номера во всей их общности, просто вы должны быть явно осведомлены о том, какие ограничения вы накладываете. Из любопытства, откуда взялось число 15? (Телефонные номера в США состоят не более чем из 10 цифр, 11, если считать начальные 1 .)

Ответ №1:

По моему опыту, круглые скобки появляются только вокруг первой группы цифр, и в группе никогда не бывает меньше 3 цифр. Это регулярное выражение делает это и предотвращает использование нескольких последовательных разделителей, за исключением пробела после пары «(123) 456-7890». Я также добавил поддержку периодов в качестве разделителей. Оно допускает 1, 2 или 3 группы чисел и пытается ввести общий диапазон из 7-15 цифр, но это приводит к ошибкам на разрешающей стороне.

 ^\s*(\d{7,15})||(\d{3,12}[\-.]?\s?\d{3,12}[\-.\s]?)||([(]?\d{3,9}[)\-.]?\s?\d{3,9}[\-.\s]?\d{3,9})\s*
  

В моей среде мне приходится избегать обратной косой черты — возможно, вам это не нужно, поэтому вам может потребоваться заменить на . Дефис должен быть экранирован, потому что в этом контексте он представляет диапазон.

Комментарии:

1. Спасибо вам всем. Комбинация приведенных выше ответов должна мне помочь. Спасибо