Узор, как это будет соответствовать все входы:
\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.
Выезда www.regexlib.com - там есть образец регулярных выражений, который может указывать на вас в правильном направлении. – Tim