java - 正则表达式: quantifying a non-capturing group

标签 java regex

参见here了解我正在尝试做的事情的一些背景。简而言之,我想匹配 /path/foo/ 下的任何路径,除非叶目录(不是叶 文件)是 script.

该问题中的一些答案似乎有效,但我试图找出为什么我尝试的某个解决方案不起作用。正则表达式是这样的:

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

我对此的诚然有限的理解如下:

  1. 文字字符串/path/foo
  2. 任意多次出现子匹配 /[^/]+。基本上,0 个或多个 / 重复模式后跟一些目录名称(我知道文件路径中的空格或特殊字符存在问题。我现在忽略它)
  3. 不是文字字符串/script。因此,如果在 (2) 中的多个重复文件夹之后,下一个是 /script,则它会失败,假设它后面跟着...
  4. 文字/
  5. 1 个或多个非 / 字符,后跟字符串结尾。

但是,this doesn't work 。它似乎匹配以 /path/foo 开头的所有内容。

这个正则表达式有什么问题?

最佳答案

考虑输入:

/path/foo/a/b/script/file

正则表达式匹配如下:

^                 Ok: No text before here
/path/foo         "/path/foo"
(?:/[^/]+)*       "/a/b/script"
(?!/script)       Ok: Text after here is "/file"
/                 "/"
[^/]*             "file"
$                 Ok: No text after here

您想要的是消极的后向回顾,而不是消极的前瞻:

^                 Ok: No text before here
/path/foo         "/path/foo"
(?:/[^/]+)*       "/a/b/script"
(?<!/script)      Fail: Text before here is "/script"
/                 "/"
[^/]*             "file"
$                 Ok: No text after here

关于java - 正则表达式: quantifying a non-capturing group,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51428811/

相关文章:

java - 当值为 "null"时,Jackson 忽略自定义字段反序列化器

java - 每 10 分钟调用一次函数

java - 使用Java Webstart部署时的依赖问题

java - 在使用 @InjectMocks 注入(inject)之前初始化模拟对象内部

python - 在正则表达式中编写可重复单词的简短版本的最佳方法| Python

java - 在 Java 中完成字符串拆分的正确正则表达式是什么?

python - 正则表达式返回两个特殊字符之间的所有字符

java - Kotlin/Java,字符串数组在方法调用时尚未初始化

ruby - 浮点正则表达式?

regex - s///返回错误的换行符