Шаблон, который вы пробовали, не работает так, как вы планировали, так как он будет соответствовать до последнего появления /
, а затем должен выполнить эту часть (?!(applications(\/.*)*))$
Часть утверждает, что непосредственно справа - это не applications
, за которым следует 0 или более повторений /
, за которым следует любой символ. Затем подтвердите конец строки.
Он начинает поиск с возвратом и не может соответствовать ни в одном из примеров.
Я думаю, что это лучше видно, когда вы опускаете $
и видите, где совпадение заканчивается:
https://regex101.com/r/aXV8vO/1
Поскольку вы не сопоставляете часть, содержащую прямую sla sh после j-
и i-
, вместо этого вы можете использовать отрицательный символьный класс [^\/]+
, соответствующий любому символу, кроме прямого sla sh.
Затем используйте отрицательный просмотр вперед \/(?!applications\b)
сразу после сопоставления прямого sla sh.
^elasticmapreduce\/j-[^\/]+\/node\/i-[^\/]+\/(?!applications\b)[^\/]*(?:\/.*)?$
Демо Regex
Примечание Если вы не хотите пересекать новые строки, вы можете использовать [^\/\r\n]+
вместо этого.