Java 正则表达式:匹配某个目录下的任何文件,除非叶目录名为";脚本“;

Java 正则表达式:匹配某个目录下的任何文件,除非叶目录名为";脚本“;,java,regex,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/foo/file.txt /路径/foo/bar/baz/file.txt /path/foo/script/bar/f

我需要一个正则表达式,它将匹配
/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/foo/file.txt
/路径/foo/bar/baz/file.txt
/path/foo/script/bar/file.txt您可以使用

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

详细信息

  • ^
    -开始输入
  • /path/foo/
    -文字子字符串
  • (?!(?:.*/)?script/[^/]*$)
    -如果在当前位置之后立即出现以下情况,则会导致匹配失败的负前瞻
    • (?:.*/)?
      -任意0+字符的可选序列,尽可能多,后跟
      /
      -这表示
      /path/foo
      脚本/文件名
      之间的任意数量的子目录
    • script/
      -表示
      script
      目录的文字子字符串
    • [^/]*
      -表示最终文件名的
      /
      以外的任何0+字符,从而使
      脚本/
      位于叶目录之上
    • $
      -结束字符串,完成文件名并确保字符串上没有其他目录
  • *
    -字符串的其余部分

使用所有格量词,确保只测试具有负lookback的叶文件夹:

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

类似于?@WiktorStribiżew的东西似乎奏效了。你能补充一个答案吗?(该网站也很棒)@WiktorStribiżew事实上,很抱歉它不太管用。如果
script
foo
@WiktorStribiżew
/path/foo/baz/script/bar/file.txt
不匹配,但应该尝试
^/path/foo/(?!./script/[^/]*$).
使用
(?!.*/script/)
您无法知道最终的脚本文件夹是否为叶。您必须添加
[^/]*$
实际上,我注意到它不太管用。如果
script
foo
之后的下一个目录,它将匹配正则表达式。例如,它将匹配
/path/foo/script/test.txt
@ewok我更新了答案,请将所有相关的测试用例添加到问题中。你能解释一下这里发生了什么吗?与Wiktor的答案有什么不同?@ewok它将产生与我相同的结果,只需
(?:[^/]*/)*+
使用所有文件夹,而不会回溯到模式中,因此,
/script/
检查只在文件夹匹配时执行一次。
^/path/foo/(?:[^/]*/)*+(?<!/script/).*
^/path/foo/(?:.*/)?+(?<!/script/).*