首页 > 解决方案 > 正则表达式:量化非捕获组

问题描述

有关我正在尝试做的事情的一些背景信息,请参见此处。简而言之,我想匹配 a 下的任何路径/path/foo/,除非叶子目录(不是叶子文件)是script.

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

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

我公认的对此的有限理解如下:

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

但是,这不起作用。它似乎与以 . 开头的所有内容相匹配/path/foo

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

标签: javaregex

解决方案


考虑输入:

/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

推荐阅读