RegEx и проверка телефонных номеров
Я изучаю RegEx, и я застрял в следующем упражнении:
Я должен соответствовать:
1 (555) 555-5555
5555555555
1 555-555-5555
555-555-5555
и не:
1 555)555-5555
(6505552368)
10 (757) 622-7382
555)-555-5555
Мое выражение (не работает):
/([0-9]? ?)?(([0-9]{3})|(\([0-9]{3}\)))( |\-)?\2\5?\2[0-9]/ig
Не могли бы вы мне помочь? Я не могу понять, что не так...
3 ответа
Хорошо, это немного сложно, чтобы проверить на самом деле.
Ну вот:
^(\d\s?(?:\(\d{3}\))?\s?[\d|\-]{8,12})$
Этот перехватывает только полные числа и возвращает полный номер, а не частичные, как другие, упомянутые в других ответах.
Проверьте здесь:
Вы могли бы придумать:
^\d\ *(?:\(\d+\))?[- \d]+$
Смотрите демо на regex101.com.
Сломано:
^ - an anchor to bind the expression to the beginning of the line
\d - one digit of 0-9
\ * - zero or more spaces
(?:\(\d+\))? - digits in parentheses, made optional
[- \d]+ - characters from the specified class
$ - bind the expression to the end
Но цитируя regex
тег:
Поскольку регулярные выражения не полностью стандартизированы, все вопросы с этим тегом должны также включать тег, указывающий применимый язык программирования или инструмент.
Пожалуйста, обновите ваш вопрос и примените используемый язык программирования.
Как указывает @Aminah, у данного регулярного выражения есть недостатки, которых можно избежать, используя предпросмотр, например:
^(?!.*-{2,})\d\ *(?:\(\d+\))?[- \d]+$
(?!.*-{2,})
гарантирует, что нет двух последовательных слэшей
Вы можете использовать это:
/^(\d? ?)?(\d{3}|\(\d{3}\))[ -]?\d{3}[ -]?\d+$/gm
Объяснение:
^(\d? ?)?
:^
соответствовать самому началу строки.\d
равно[0-9]
(\d{3}|\(\d{3}\))
: Это соответствует второй группе, где скобки не являются обязательными. Вы были правы, но вы поставили слишком много лишних скобок.[ -]?
: Это равно( |-)?
\d+$
:$
для конца строки./gm
:m
флаг для нескольких строк