Создание регулярного выражения, которое будет соответствовать требованиям в строке

Мне нужно написать регулярное выражение, которое будет соответствовать следующим требованиям в строке со структурой {A / B}.

Требования / условия:

  • A и B могут быть только одним из [UGWRB].
  • Структура, в которой U или G не отображаются, недействительна.
  • Структура, в которой оба символа равны, недопустима.
  • U или G должны появиться в комбинации хотя бы один раз.
  • Структура может повторяться или продолжаться бесконечное количество раз, пока каждый последующий экземпляр все еще действителен при чтении в одиночку. (см. действительные совпадения ниже)

Допустимые совпадения:

  • {U / G} {U / G} {U / G}
  • {Вт / G} {U / B}
  • {U / G} {U / B}
  • {U / G}
  • {G / U}
  • {U / B}

Неверные совпадения:

  • {U / U} {U / U}
  • {U / U} {G / G}
  • {U / G} {U / U}
  • {U / G} {R / B}
  • {G / G}
  • {R / B}
  • {W / R}
  • {B / W}

Это то, что я получил до сих пор, но из всех комбинаций UGWRB я получаю только 8 матчей из 14.

{([UG])(?(1)|\w)\/(?(1)\w|[UG])}

2

Решение

Чтобы выполнить задачу, вы должны работать как с негативными, так и с позитивными взглядами:

^(?:{(?=[^{}]*[UG])([UGWRB])\/(?!\1)(?1)})+$

Увидеть живое демо здесь

Обратите внимание, что m флаг должен быть установлен.

Распределение регулярных выражений:

  • ^ Совпадение начала входной строки
  • (?: Начало группы без захвата
    • { Матч { в прямом смысле
    • (?= Начало позитивного взгляда
      • [^{}]*[UG] Ищите [UG] в комбинации
    • ) Конец предвкушения
    • ([UGWRB]) Совпадение и захват буквы из класса персонажей
    • \/(?!\1)(?1) Матч / и посмотреть, если следующий символ не совпадает с недавно захваченным
    • } Матч } в прямом смысле
  • )+ Конец группы, повторите хотя бы один раз
  • $ Совпадение конца входной строки
1

Другие решения

Попробуйте это регулярное выражение:

^(?!.*{([UGWRB])\/\1})(?:{(?(?=[UG]).\/[UGWRB]|[WRB]\/[UG])})+$

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

Объяснение:

  • ^ — соответствует началу строки
  • (?!.*{([UGWRB])\/\1}) — негативный взгляд, чтобы убедиться, что такие структуры, как {G/G} или же {U/U} или же {R/R} нет нигде в строке
  • { — Матчи {
  • (?(?=[UG]).\/[UGWRB]|[WRB]\/[UG])Regex Conditional. Если текущая позиция сопровождается либо U или же Gзатем сопоставьте этот символ с последующим / и класс персонажа [UGWRB], В противном случае, сопоставьте класс персонажа [WRB] с последующим / с последующим U или же G
  • } — Матчи }
  • + — соответствует 1+ вхождения вышеуказанной подпоследовательности (?:{(?(?=[UG]).\/[UGWRB]|[WRB]\/[UG])})
  • $ — соответствует концу строки
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector