我需要一个正则表达式来匹配 /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
之后有 2 个斜线
我不太明白。基本上,我需要在 foo
之后放置任意数量的 /[^/]+
,然后我可以使用 (?!/script)
作为消极的前瞻。我该如何编写该正则表达式?
最佳答案
你可以使用
^/path/foo/(?!(?:.*/)?script/[^/]*$).*
参见 regex demo
详情
^
- 输入开始/path/foo/
- 文字子串(?!(?:.*/)?script/[^/]*$)
- 如果在当前位置之后紧接着有(?:.*/)?
- 任意 0+ 个字符的可选序列,尽可能多,后跟/
- 这表示任意数量的子目录在/path/foo
和script/filename
之间
script/
- 表示script
目录的文字子字符串[^/]*
- 除/
之外的任何 0+ 个字符表示最终文件名,因此使script/
上面的叶目录$
- 字符串结尾完成文件名并确保字符串上没有其他目录
.*
- 字符串的其余部分。
关于java - 正则表达式 : match any file under a certain directory, 除非叶目录被称为 "script",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51428249/