@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))$#
Но в моей реальной задаче если так определаять каждый вариант то регулярка будет такая длинная, что просто трындец. Короч кто знает подскажите. Благодарю.
  • Вопрос задан
  • 191 просмотр
Решения вопроса 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 это, видимо, не сработает, там синтаксис другой.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Ведисофт Екатеринбург
от 25 000 ₽
YCLIENTS Москва
от 200 000 до 350 000 ₽
от 300 000 до 500 000 ₽
20 апр. 2024, в 18:09
70000 руб./за проект
20 апр. 2024, в 18:04
3000 руб./за проект
20 апр. 2024, в 17:55
3000 руб./за проект