正则表达式匹配不在特定目录中的所有路径
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)[^\/]*(?:\/.*)?$
注意如果你不想跨行,你可以使用[^\/\r\n]+
代替。
目标:我想匹配所有不在 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)[^\/]*(?:\/.*)?$
注意如果你不想跨行,你可以使用[^\/\r\n]+
代替。