正则表达式:量化非捕获组

时间:2018-07-19 17:36:23

标签: 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开头的所有内容都匹配。

此正则表达式有什么问题?

1 个答案:

答案 0 :(得分:3)

考虑输入:

services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
    .AddIdentityServerAuthentication(options =>
    {
      options.Authority = "IdentityServerURL";
      options.ApiName = "apiScope";
    });

正则表达式匹配如下:

/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