我需要一个正则表达式,它将与/path/foo
下的任何文件匹配,除非叶子目录称为script
。因此,例如,这些应该匹配:
/path/foo/file.txt
/path/foo/bar/baz/file.txt
/path/foo/script/bar/file.txt <-- not the leaf directory, so this is fine
但是这些不应该:
/path/bar/file.txt
/path/foo/bar/script/file.txt <-- leaf directory, so no match
/path/foo/script/file.txt
我尝试了几件事,但是它们都有一些小问题:
/path/foo/(?!.*script)/[^/]*
如果叶子目录包含字符串“ script”,则匹配/path/foo(?!.*/script)/[^/]*
匹配路径/path/foo1/script/file.txt
/path/foo/(?!.*/script)/[^/]*
仅在foo
和script
之间存在一层,或者由于某些原因在foo
之后有两个斜杠时才匹配我不太正确。基本上,我需要在/[^/]+
之后放置任意数量的foo
,然后才能将(?!/script)
用作否定的前瞻。我该如何写该正则表达式?
答案 0 :(得分:2)
您可以使用
^/path/foo/(?!(?:.*/)?script/[^/]*$).*
请参见regex demo
详细信息
^
-输入开始/path/foo/
-文字子字符串(?!(?:.*/)?script/[^/]*$)
-如果在当前位置之后立即有一个否定的超前查询,则匹配失败
(?:.*/)?
-尽可能多的任意0个字符的可选序列,后跟/
-这表示/path/foo
和script/filename
之间的任意数量的子目录< / li>
script/
-代表script
目录的文字子字符串[^/]*
-除/
以外的任何0+字符代表最终文件名,从而使script/
位于叶目录上方$
-字符串结尾,用于完成文件名并确保字符串上没有其他目录.*
-字符串的其余部分。答案 1 :(得分:1)
使用所有格修饰符确保只测试带有负向外观的叶子文件夹:
^/path/foo/(?:[^/]*/)*+(?<!/script/).*
使用所有格量词(?:[^/]*/)*+
,您可以确保已到达最后一个文件夹,并且如果后向断言失败,则正则表达式引擎无法返回以尝试成功。
也可以这样:
^/path/foo/(?:.*/)?+(?<!/script/).*