2013-10-15 4 views
4

Я попытался несколько раз написать средство проверки правильности регулярного выражения для веб-формы формы интрасети asp.net. Я попытался подделать мои безрезультатно. Текущий, который я использую и пытаюсь отредактировать, -Регулярное выражение для номера телефона и только для расширения

((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4} 

Мне нужно уметь.

x1245 
508-555-1212 
5085551212 
508 555 1212 
508-555-1212 x1234 
5085551212 x1243 
508 555 1212 x1234 

Единственный, кого я накрыл, является вторым в списке, вторым.

+0

Выезда www.regexlib.com - там есть образец регулярных выражений, который может указывать на вас в правильном направлении. – Tim

ответ

5

Это сделает это.

(\d\d\d-?\s?\d\d\d-?\s?\d\d\d\d\s?)?(x\d\d\d\d)? 

или короче эквивалент:

(\d{3}-?\s?\d{3}-?\s?\d{4}\s?)?(x\d{4})? 

Вы хотите, чтобы соответствовать номер телефона, возможно, с пространством/тире, и сделать это все это по желанию, а затем включить расширение, и сделать это по желанию тоже.

+0

+1 Спасибо. Протестировано и работает – KBriz

+1

Обратите внимание, что это также будет соответствовать пустой строке. –

+1

Закрыть. Вам не хватает совпадения для дополнительного пространства между номером и расширением. Я пошел с этим '(\ d {3} (- | \ s)? \ D {3} (- | \ s)? \ D {4} \ s?)? \ S? (X {1} \ d {4})? –

4

Узор, как это будет соответствовать все входы:

\d{3}[- ]?\d{3}[- ]?\d{4}(x\d{4})?|x\d{4} 

Это будет соответствовать либо:

  • три цифры
  • дополнительное пространство или дефис
  • три цифры
  • дополнительное пространство или дефис
  • четыре цифры
  • необязательная группа:

    • пространства, а литерал x
    • четыре цифры

    — или —

  • пробел и буквальным x
  • четыре цифры

В зависимости от ваших точных потребностей, вы, возможно, потребуется, чтобы начать (^) и конец ($) анкеров запретить дополнительные символы вокруг рисунка (например, "foo x1234 bar"):

^\d{3}[- ]?\d{3}[- ]?\d{4}(x\d{4})?|x\d{4}$ 

Update

Если вы хотите, чтобы убедиться, что цифра два сепаратора между сегментами номер три телефона должны быть одинаковыми — например508-555 1212 не будет разрешено — самым простым способом было бы что-то вроде этого:

\d{3}([- ]?)\d{3}\1\d{4}(x\d{4})?|x\d{4} 

(...) создает захват группы, и потому, что это случается, первый один в шаблоне, он упоминается как группа 1. \1 является обратная ссылка, которая будет соответствовать только точную строку, которая была согласованной в группе 1.

+0

Единственное ограничение - это позволит «508-555 1212», которое ОП не указало, является ли оно законным или не ... –

+0

@BobVale Это правда. Я представил альтернативный шаблон, который должен работать в этом случае. –

+0

I defenitley предпочитает, чтобы шаблон был таким же, как и вход – KBriz

2

Это один довольно сложный, но будет соответствовать

var regex = new Regex(@"^(?<number>\d{3}(?<separator>([\s-]|))\d{3}\k<separator>\d{4})?" + 
         "((?<=\d)\s|(?<=^)|(?=$))" + 
         "(?<extension>x\d{4})?(?<=.)$"); 
  • ^ начало строки
  • (?<number> начальный номер имени группы
  • \d{3} матч 3 цифры
  • (?<separator> старт имени группы сепаратора
  • ([\s-]|) матч пространство, - или пустая строка
  • ) близко группа Seperator
  • \d{3} соответствует 3 цифрам
  • \k<separator> матч предыдущего сепаратора
  • \d{4} матч 4 цифры
  • ) близко Номер группы
  • ? предыдущий матч не является обязательным
  • ((?<=d)\s|(<=^)|(?=$)) предыдущий символ является цифрой и соответствовать пространство, или соответствует нулевой длины, если в начале или в конце строки
  • (?<extension>) начало имени группы расширение
  • x\d{4} матч x следуют 4-х цифр.
  • ) близко группа расширения
  • ? расширение группа является необязательной
  • (?<=.) нулевой длиной матча, который страхует строку не пуст
  • $ матча конца строки
Смежные вопросы