Условная длина регулярного выражения на основе первого символа - PullRequest
0 голосов
/ 21 января 2020

Есть строка с числами, которую мне нужно проверить с помощью PHP preg_match. Если он начинается с 10, 20 или 30, мне нужно еще 7 чисел после начального 2, но в любых других случаях мне нужно только 8 чисел, и мне все равно, какие главные герои. Первая часть простая /^(1|2|3)0\d{7}$

Но как я могу добавить ELSE часть? Там мне нужно простое

^\d{8}$

Мне нужно сопоставить эти примеры:

101234567

201234567

12345678

33445566

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Вот альтернатива с использованием (?(?=regex)then|else) aka условных выражений :

^(?(?=[1-3]0)[1-3]0\d{7}|\d{8})$

Буквально говорится: если [1-3]0 в самом начале, соответствует [1-3]0\d{7}, иначе соответствует \d{8}.

Демонстрация: https://regex101.com/r/LXoHyk/1 (примеры, бесстыдно взятые из ответа Виктора)

0 голосов
/ 21 января 2020

Вы можете использовать

^(?:[1-3]0\d{7}|(?![1-3]0)\d{8})$

См. Демоверсию regex

Подробности

  • ^ - начало строки
  • (?: - начало группы без захвата:
    • [1-3]0\d{7} - 1, 2 или 3, затем 0 и любой 7 цифр
    • | - или
    • (?![1-3]0)\d{8} - нет 10, 20 или 30 непосредственно в начале строки, тогда любые 8 цифр
  • ) - конец группы
  • $ - конец строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...