Создание регулярного выражения, которое будет соответствовать требованиям в строке - PullRequest
0 голосов
/ 08 января 2019

выпуск

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

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

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

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

  • {Вт / G} {U / B}
  • {U / G} {U / B}
  • {U / G}
  • {G / U} * 1 034 *
  • {U / B}
  • ...

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

  • {U / U} {U / U}
  • {U / G} {R / B} * * тысяча пятьдесят-дв
  • {G / G *} * тысяча пятьдесят-четырь * * {Одна тысяча пятьдесят пять R / B} * * одна тысяча пятьдесят-шесть * * +1057 {W / R}
  • {B / W}
  • ...

Моя попытка

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

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

Ответы [ 2 ]

0 голосов
/ 08 января 2019

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

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

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

Пояснение:

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

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

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

Смотрите демо здесь

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

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

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