求可验证目录路径的正则表达式:匹配../../a/b/c,不匹配../a/../b/c
嘿,这个需求我懂了——要匹配那种先连续跳上级目录,之后只往子目录走的路径,不能有进了某个目录又退回来的操作对吧?没问题,给你一个精准的正则表达式:
^(?:\.\./)+(?:(?!\.\.)[^/]+(?:/(?!\.\.)[^/]+)*)?$
规则拆解
我给你掰扯清楚每个部分的作用,方便你理解和调整:
^:锚定字符串的开头,确保我们从路径最开始匹配(?:\.\./)+:匹配一个或多个连续的../,用非捕获组(?:...)是为了避免额外的分组捕获,不影响后续逻辑(?: ... )?:这部分是可选的,允许路径只由../组成(比如../../这种纯上级跳转的路径)(?!\.\.)[^/]+:匹配单个合法目录名——(?!\.\.)是负向前瞻,保证这个片段不是..;[^/]+确保目录名里不含/(毕竟路径分隔符不能出现在目录名里)(?:/(?!\.\.)[^/]+)*:支持多级子目录,匹配零个或多个「/+合法目录名」的组合
测试验证
咱们来对照你的需求试几个例子:
会匹配的路径
../../a/b/c(完全符合先跳上级再进子目录的规则)../my-project/src../../(纯上级跳转)../docs/v1.2(目录名带点也没问题,只要不是..就行)
不会匹配的路径
../a/../b/c(中间出现了a/../,属于进目录又退回的操作)../a/..../../a/../bhome/../docs(开头不是../,直接排除)
可选调整
如果需要支持绝对路径(比如/../../a/b/c),可以把正则开头改成:
^(?:/?\.\./)+(?:(?!\.\.)[^/]+(?:/(?!\.\.)[^/]+)*)?$
如果要禁止路径里的连续斜杠(比如../../a//b/c),可以把目录部分的正则改成:
^(?:\.\./)+(?:(?!\.\.)[^/]+(?:/(?!\.\.|/)[^/]+)*)?$
内容的提问来源于stack exchange,提问作者Tupu Sipaia Kikhteva
相关产品推荐
相关产品推荐

