正则表达式:匹配特定目录下的任何文件,除非叶目录称为“脚本”

时间:2018-07-19 17:01:18

标签: java regex

我需要一个正则表达式,它将与/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

我尝试了几件事,但是它们都有一些小问题:

  1. /path/foo/(?!.*script)/[^/]*如果叶子目录包含字符串“ script”,则匹配
  2. /path/foo(?!.*/script)/[^/]*匹配路径/path/foo1/script/file.txt
  3. /path/foo/(?!.*/script)/[^/]*仅在fooscript之间存在一层,或者由于某些原因在foo之后有两个斜杠时才匹配

我不太正确。基本上,我需要在/[^/]+之后放置任意数量的foo,然后才能将(?!/script)用作否定的前瞻。我该如何写该正则表达式?

2 个答案:

答案 0 :(得分:2)

您可以使用

^/path/foo/(?!(?:.*/)?script/[^/]*$).*

请参见regex demo

详细信息

  • ^-输入开始
  • /path/foo/-文字子字符串
  • (?!(?:.*/)?script/[^/]*$)-如果在当前位置之后立即有一个否定的超前查询,则匹配失败
    • (?:.*/)?-尽可能多的任意0个字符的可选序列,后跟/-这表示/path/fooscript/filename之间的任意数量的子目录< / li>
    • script/-代表script目录的文字子字符串
    • [^/]*-除/以外的任何0+字符代表最终文件名,从而使script/位于叶目录上方
    • $-字符串结尾,用于完成文件名并确保字符串上没有其他目录
  • .*-字符串的其余部分。

答案 1 :(得分:1)

使用所有格修饰符确保只测试带有负向外观的叶子文件夹:

^/path/foo/(?:[^/]*/)*+(?<!/script/).*

demo

使用所有格量词(?:[^/]*/)*+,您可以确保已到达最后一个文件夹,并且如果后向断言失败,则正则表达式引擎无法返回以尝试成功。


也可以这样:

^/path/foo/(?:.*/)?+(?<!/script/).*