参见here了解我正在尝试做的事情的一些背景。简而言之,我想匹配 /path/foo/
下的任何路径,除非叶目录(不是叶 文件)是 script
.
该问题中的一些答案似乎有效,但我试图找出为什么我尝试的某个解决方案不起作用。正则表达式是这样的:
^/path/foo(?:/[^/]+)*(?!/script)/[^/]*$
我对此的诚然有限的理解如下:
- 文字字符串
/path/foo
- 任意多次出现子匹配
/[^/]+
。基本上,0 个或多个/
重复模式后跟一些目录名称(我知道文件路径中的空格或特殊字符存在问题。我现在忽略它) - 不是文字字符串
/script
。因此,如果在 (2) 中的多个重复文件夹之后,下一个是/script
,则它会失败,假设它后面跟着... - 文字
/
- 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/