Регулярное выражение - Номер телефона (включая +, (,) и проверка длины - C#

Недавно я придумал регулярное выражение для номера телефона, так как это уже сделали многие разработчики, и я нашел решение, связанное с тем же. И сделал то же самое в производстве.

Версия № 1 только с номерами:

@"\(?\d{3}\)?-? *\d{3}-? *-?\d{4}"

Но тогда есть дополнительное требование: нам нужно разрешить специальные символы, такие как - а также ()
Поэтому я изменил регулярное выражение до версии #2, как указано ниже:

@"^([\+]?[0-9]{1}[0-9]{0,2})[\s-]?[\(]?(0?[0-9]\d{0,4}[\)]?[-\s]?)([0-9][\d-\s]{5,7}[\s]?)(x[\d-]{0,4})?$"

Теперь, проверяя длину телефонного номера, QA обнаружил, что он принимает более 16 символов, мне нужно снова поработать над регулярным выражением, чтобы оно заработало.

Вот где я обнаружил проблему, связанную с длиной проверки номера телефона с помощью регулярного выражения.

  • Есть ли способ указать, что номер телефона должен принимать минимальную длину как 10 и максимальную длину как 15, изменяя регулярное выражение?

Пример здесь может быть 123456789 - хотите пометить это как неверный номер телефона, так как он имеет только 9 цифр
Пример здесь может быть 1234567890123456 - хотите пометить это как неверный номер телефона, так как он имеет только 16 цифр

  • Есть ли способ указать, что одиночная левая скобка и одинарная правая скобка недействительны внутри номера телефона путем изменения регулярного выражения?

Пример здесь может быть 12(34567890 - хотите пометить это как Неверный номер телефона, так как он содержит только круглые скобки

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

1 ответ

Решение

Вы можете использовать регулярное выражение с (?=(?:\D*\d){10,15}\D*$) положительный взгляд на якорь в начале:

^(?=(?:\D*\d){10,15}\D*$)\+?[0-9]{1,3}[\s-]?(?:\(0?[0-9]{1,5}\)|[0-9]{1,5})[-\s]?[0-9][\d\s-]{5,7}\s?(?:x[\d-]{0,4})?$

Смотрите демо-версию регулярного выражения.

Детали:

  • ^ - начало строки
  • (?=(?:\D*\d){10,15}\D*$) - положительный прогноз, обеспечивающий от 10 до 15 последовательностей нецифров, за которыми следует 1 цифра, а затем 0+ цифр до конца строки
  • \+? - необязательный + условное обозначение
  • [0-9]{1,3} - от 1 до 3 цифр
  • [\s-]? - необязательный пробел или -
  • (?:\(0?[0-9]{1,5}\)|[0-9]{1,5}) - любой из двух вариантов:
    • \(0?[0-9]{1,5}\) - а (От 1 до 5 цифр, )
    • | - или же
    • [0-9]{1,5} - от 1 до 5 цифр
  • [-\s]? - необязательный пробел или -
  • [0-9] - цифра
  • [\d\s-]{5,7} - от 5 до 7 цифр, пробелов или -
  • \s? - необязательный пробел
  • (?:x[\d-]{0,4})? - необязательная последовательность:
    • x - буквальный x
    • [\d-]{0,4} - от 0 до 4 цифр -
  • $ конец строки.
Другие вопросы по тегам