java - 正则表达式 : match any file under a certain directory, 除非叶目录被称为 "script"

标签 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 之后有 2 个斜线

我不太明白。基本上,我需要在 foo 之后放置任意数量的 /[^/]+,然后我可以使用 (?!/script) 作为消极的前瞻。我该如何编写该正则表达式?

最佳答案

你可以使用

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

参见 regex demo

详情

  • ^ - 输入开始
  • /path/foo/ - 文字子串
  • (?!(?:.*/)?script/[^/]*$) - 如果在当前位置之后紧接着有
    • (?:.*/)? - 任意 0+ 个字符的可选序列,尽可能多,后跟 / - 这表示任意数量的子目录在 /path/fooscript/filename
    • 之间
    • script/ - 表示 script 目录的文字子字符串
    • [^/]* - 除 / 之外的任何 0+ 个字符表示最终文件名,因此使 script/ 上面的叶目录
    • $ - 字符串结尾完成文件名并确保字符串上没有其他目录
  • .* - 字符串的其余部分。

关于java - 正则表达式 : match any file under a certain directory, 除非叶目录被称为 "script",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51428249/

相关文章:

java - 如何使用 lambda 表示法创建具有初始容量和自定义比较器的优先级队列?

Java正则表达式替换文件中的字符串

javascript - 小于或大于除 html 标签之外的字符?

regex - 正则表达式模式困惑

java - 数据绑定(bind)列表框控件,可以是单值或多值

java - 验证并突出显示 JTable 单元格

java - YourKit 是否报告 ReentrantLocks?

java - 字符串生成器替换如何工作?

regex - 清理数据框中的基因名称

regex - 将三个函数合并为一个函数,以删除特定字符和数字周围的所有可能的空格