正则表达式匹配不在特定目录中的所有路径

Regex to match all paths which are not in a specific directory

目标:我想匹配所有不在 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/ 来测试正则表达式模式。

您尝试的模式没有按预期工作,因为它会一直匹配到 / 最后一次出现,然后必须满足这部分 (?!(applications(\/.*)*))$

该部分断言直接在右边的不是 applications 后跟 0 次或多次重复的 / 后跟任何字符。然后断言字符串的结尾。

开始回溯,无法在任何例子中匹配。

我认为当您省略 $ 并查看比赛结束位置时效果更好:

https://regex101.com/r/aXV8vO/1


由于您没有匹配在 j-i- 之后包含正斜杠的部分,您可以使用否定字符 class 而不是 [^\/]+ 匹配除正斜杠外的任何字符。

然后在匹配正斜杠后立即使用否定前瞻\/(?!applications\b)

^elasticmapreduce\/j-[^\/]+\/node\/i-[^\/]+\/(?!applications\b)[^\/]*(?:\/.*)?$

Regex demo

注意如果你不想跨行,你可以使用[^\/\r\n]+代替。