Мне нужно написать регулярное выражение, которое будет соответствовать следующим требованиям в строке со структурой {A / B}.
Требования / условия:
Допустимые совпадения:
Неверные совпадения:
Это то, что я получил до сих пор, но из всех комбинаций UGWRB я получаю только 8 матчей из 14.
{([UG])(?(1)|\w)\/(?(1)\w|[UG])}
Чтобы выполнить задачу, вы должны работать как с негативными, так и с позитивными взглядами:
^(?:{(?=[^{}]*[UG])([UGWRB])\/(?!\1)(?1)})+$
Увидеть живое демо здесь
Обратите внимание, что m
флаг должен быть установлен.
Распределение регулярных выражений:
^
Совпадение начала входной строки(?:
Начало группы без захвата
{
Матч {
в прямом смысле(?=
Начало позитивного взгляда
[^{}]*[UG]
Ищите [UG] в комбинации)
Конец предвкушения([UGWRB])
Совпадение и захват буквы из класса персонажей\/(?!\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])})
$
— соответствует концу строки