目标: 我想匹配所有不在的路径。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模式。
你试过的模式并不能如你所愿,因为它会匹配到最后一个出现的 /
然后要完成这部分 (?!(applications(\/.*)*))$
该部分断言直接向右的东西不是 applications
随后是0次或更多次重复的 /
后面跟着任何char。然后断言字符串的结束。
它开始回溯,在任何一个例子中都不能匹配。
我认为如果省略了后面的 $
并看看比赛的结局。
由于您没有匹配到包含在 j-
和 i-
你可以使用否定字符类来代替。[^\/]+
匹配除正向斜线以外的任何字符。
然后使用负向的 lookahead \/(?!applications\b)
匹配斜杠后的右方。
^elasticmapreduce\/j-[^\/]+\/node\/i-[^\/]+\/(?!applications\b)[^\/]*(?:\/.*)?$
注 如果你不想跨越新线,你可以使用 [^\/\r\n]+
而不是。