Регулярное выражение для соответствия всем путям, которые не находятся в указанном каталоге c - PullRequest
0 голосов
/ 08 мая 2020

Цель : я хочу сопоставить все пути, которые НЕ находятся в elasticmapreduce/j-abc123/node/i-abc123/applications каталоге

Ниже приведен набор возможных путей:

elasticmapreduce/j-abc123/node/i-abc123/applications/hadoop-yarn/hadoop-yarn-proxyserver-ip.log.2020-05-07-00.gz
elasticmapreduce/j-abc123/node/i-abc123/applications/hadoop-yarn/hadoop-yarn-timelineserver-ip.out.gz
elasticmapreduce/j-abc123/node/i-abc123/applications/hadoop-yarn/hadoop-yarn-proxyserver-ip.log.gz
elasticmapreduce/j-abc123/node/i-abc123/applications/hive/user/hive/hive.log.2020-05-07.gz
elasticmapreduce/j-abc123/node/i-abc123/applications
elasticmapreduce/j-abc123/node/i-abc123/bootstrap-actions/master.log.2020-05-07-00.gz
elasticmapreduce/j-abc123/node/i-abc123/bootstrap-actions
elasticmapreduce/j-abc123/node/i-abc123/daemons/instance-state/instance-state.log-2020-05-08-13-30.gz
elasticmapreduce/j-abc123/node/i-abc123/daemons/setup-dns.log.gz
elasticmapreduce/j-abc123/node/i-abc123/provision-node/abc123/stderr.gz
elasticmapreduce/j-abc123/node/i-abc123/provision-node/apps-phase/0/abc123/stderr.gz
elasticmapreduce/j-abc123/node/i-abc123/provision-node/reports/0/abc123/ip.ec2.internal/201805270306.yaml.gz
elasticmapreduce/j-abc123/node/i-abc123/setup-devices/setup_var_log_dir.log.gz

Следующее регулярное выражение соответствует всем путям, содержащим elasticmapreduce/j-abc123/node/i-abc123/applications:

^elasticmapreduce\/j-.*\/node\/i-.*\/(applications(\/.*)*)$

Я хочу сопоставить все пути, которые НЕ были сопоставлены указанным выше шаблоном регулярного выражения.

Почему следующее регулярное выражение не делает этого ?

^elasticmapreduce\/j-.*\/node\/i-.*\/(?!(applications(\/.*)*))$

PS, я использую https://regex101.com/ для проверки шаблонов регулярных выражений.

1 Ответ

1 голос
/ 08 мая 2020

Шаблон, который вы пробовали, не работает так, как вы планировали, так как он будет соответствовать до последнего появления /, а затем должен выполнить эту часть (?!(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]+ вместо этого.

...