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/).*