Соответствует регулярному номеру телефона - PullRequest
1 голос
/ 25 февраля 2020

Я довольно новичок в регулярных выражениях и не уверен, что именно делаю неправильно.

Я ищу регулярное выражение, которое соответствует следующему числовому формату:

Соответствующие требования :

  1. Должен начинаться с 0 или 3
  2. Должен быть от 7 до 11 цифр
  3. Не должен разрешать возрастающие цифры. например, 0123456789, 01234567
  4. Не должен разрешать повторяющиеся цифры. например, 011111111, 3333333333, 0000000000

Вот что я придумал:

^(?=(^[0,3]{1}))(?!.*(\d)\1{3,})(?!^(?:0(?=1|$))?(?:1(?=2|$))?(?:2(?=3|$))?(?:3(?=4|$))?(?:4(?=5|$))?(?:5(?=6|$))?(?:6(?=7|$))?(?:7(?=8|$))?(?:8(?=9|$))?9?$).{7,11}$

Приведенное выше регулярное выражение не соответствует условию № (4). Не знаю, почему, хотя.

Любая помощь будет оценена.

Спасибо

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

Несколько замечаний о шаблоне, который вы пробовали

  • Вы можете опустить {1} и запятую в [0,3]
  • В перспективе (?!.*(\d)\1{3,}) (\d) является второй группой захвата, потому что (?=(^[0,3]{1})) содержит первую группу захвата, поэтому она должна быть \2 вместо \1
  • . В дальнейшем вы можете опустить запятую в {3,}
  • В самом совпадении вы используете .{7,11}, где точка будет соответствовать любому символу, кроме новой строки. Вместо этого вы можете использовать \d, чтобы сопоставлять только цифры

Ваш шаблон может выглядеть следующим образом

^(?=(^[03]))(?!.*(\d)\2{3})(?!^(?:0(?=1|$))?(?:1(?=2|$))?(?:2(?=3|$))?(?:3(?=4|$))?(?:4(?=5|$))?(?:5(?=6|$))?(?:6(?=7|$))?(?:7(?=8|$))?(?:8(?=9|$))?9?$)\d{7,11}$

Regex demo

Или оставить из первого взгляда и переместите его к совпадению, изменив квантификатор на \d{6,10} и повторив группу захвата \1 вместо \2

^(?!.*(\d)\1{3})(?!(?:0(?=1|$))?(?:1(?=2|$))?(?:2(?=3|$))?(?:3(?=4|$))?(?:4(?=5|$))?(?:5(?=6|$))?(?:6(?=7|$))?(?:7(?=8|$))?(?:8(?=9|$))?9?$)[03]\d{6,10}$

Regex demo

Редактировать

Исходя из комментариев, строка не имеет 4 восходящих цифр:

^(?!.*(\d)\1{3})[03](?!\d*(?:0123|1234|2345|3456|4567|5678|6789))\d{6,10}$

Regex demo

0 голосов
/ 25 февраля 2020

Решением для JS аромата PCRE будет

/^[03](?!123456(7(8(9|$)|$)|$))(?!(?<d>.)\k<d>+$)[0-9]{6,10}$/

Пояснения

  1. ^[03] начинается в начале строки , затем читает 0 или 3
  2. (?!123456(7(8(9|$)|$)|$)), чтобы убедиться, что после этого первого символа не существует последовательности (если последовательность может быть прочитана, то отрицательный прогноз не удастся
  3. (?!(?<d>.)\k<d>+$) это еще один негативный взгляд: он гарантирует, что первое чтение символа (помеченное d ) не будет повторяться снова и снова, пока конец строки
  4. [0-9]{6,10}$/ наконец не прочитает от 6 до 10 цифр (сначала один уже прочитан)

Несколько тестов:

  • "0123456789: Нет совпадений"
  • "01234567: Нет совпадений"
  • "01234568: Нет совпадений"
  • "011111111: Нет совпадений"
  • "33333333: Нет совпадений"
  • "333333233 действительно"
  • "042157891023 is действительный "
  • " 019856: нет совпадений "
  • " 0123451245 действительный "
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...