@vitalykostak

Как исполнить функцию условных операторов в регулярном выражении?

#^(1|2|3)/sometext/sometext/(1a|2a|3a)$#
Попробую объяснить, в первой подмаске будет находиться один из трех вариантов, как сделать так, чтобы во второй подмаске мог быть один и только один соответствующий первой подмаске вариант? Например:
1/sometext/sometext/1a - эта строка пройдет валидацию
2/sometext/sometext/2a - эта строка пройдет валидацию
3/sometext/sometext/3a - эта строка пройдет валидацию
3/sometext/sometext/2a - эта строка не пройдет валидацию
2/sometext/sometext/1a - эта строка не пройдет валидацию
Я знаю что конкретно этот пример можно решить и так:
#^((1/sometext/sometext/1a)|(2/sometext/sometext/2a)|(3/sometext/sometext/3a))$#
Но в моей реальной задаче если так определаять каждый вариант то регулярка будет такая длинная, что просто трындец. Короч кто знает подскажите. Благодарю.
  • Вопрос задан
  • 193 просмотра
Решения вопроса 1
@dodo512
https://regex101.com/r/IHgidB/1
^(?:1()|2()|3())/sometext/sometext/(?:\1first|\2second|\3third)$


https://regex101.com/r/IHgidB/2
^(?:1()|2()|3())/sometext/sometext/(?(1)first)(?(2)second)(?(3)third)$
условные подмаски

https://regex101.com/r/IHgidB/3
^(?:1(/sometext/sometext/)first|2(?1)second|3(?1)third)$
рекурсивные подмаски
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@x_dmitry_x
^(1|2|3)/sometext/sometext/\1a$
Ответ написан
Комментировать
@DanKud
Группы в самом регулярном выражении вставляются через слэш - \номер_группы
#^(1|2|3)/sometext/sometext/(\1a)$#
Ответ написан
fzfx
@fzfx
18,5 дм
в perl'е что-то похожее можно сделать:
$_='1/sometext/sometext/first';
s/^(1|2|3|.*)(.*)(\/.*?)$/($1==1?"$2\/first":""|$1==2?"$2\/second":""|$1==3?"$2\/third":"")=~"\/sometext\/sometext$3"?1:0/e;
print;

если 1 - есть совпадение, если 0 - нету. единственное требование для данного выражения - в строке должен быть хотя бы один символ /, иначе регулярка не отработает как надо.
ну и для php это, видимо, не сработает, там синтаксис другой.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы