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})$

Этот перехватывает только полные числа и возвращает полный номер, а не частичные, как другие, упомянутые в других ответах.

Проверьте здесь:

https://regex101.com/r/hI5vT2/2

Вы могли бы придумать:

^\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

демонстрация

Объяснение:

  1. ^(\d? ?)?: ^ соответствовать самому началу строки. \d равно [0-9]
  2. (\d{3}|\(\d{3}\)): Это соответствует второй группе, где скобки не являются обязательными. Вы были правы, но вы поставили слишком много лишних скобок.
  3. [ -]?: Это равно ( |-)?
  4. \d+$: $ для конца строки.
  5. /gm: m флаг для нескольких строк
Другие вопросы по тегам