匹配所有不在特定目录下的路径的Regex。

问题描述 投票:0回答:1

目标: 我想匹配所有不在的路径。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

以下regex匹配所有包含 elasticmapreduce/j-abc123/node/i-abc123/applications:

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

我想匹配所有未被上述regex模式匹配的路径。

为什么下面的regex不能做到这一点?

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

PS, 我使用 https:/regex101.com 来测试regex模式。

regex regex-negation
1个回答
1
投票

你试过的模式并不能如你所愿,因为它会匹配到最后一个出现的 / 然后要完成这部分 (?!(applications(\/.*)*))$

该部分断言直接向右的东西不是 applications 随后是0次或更多次重复的 / 后面跟着任何char。然后断言字符串的结束。

它开始回溯,在任何一个例子中都不能匹配。

我认为如果省略了后面的 $ 并看看比赛的结局。

https:/regex101.comraXV8vO1。


由于您没有匹配到包含在 j-i-你可以使用否定字符类来代替。[^\/]+ 匹配除正向斜线以外的任何字符。

然后使用负向的 lookahead \/(?!applications\b) 匹配斜杠后的右方。

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

注册表演示

如果你不想跨越新线,你可以使用 [^\/\r\n]+ 而不是。

© www.soinside.com 2019 - 2024. All rights reserved.