java - 正则表达式:量化非捕获组
问题描述
有关我正在尝试做的事情的一些背景信息,请参见此处。简而言之,我想匹配 a 下的任何路径/path/foo/
,除非叶子目录(不是叶子文件)是script
.
该问题中有一些似乎可行的答案,但我试图弄清楚为什么我尝试的某个解决方案不起作用。正则表达式是这样的:
^/path/foo(?:/[^/]+)*(?!/script)/[^/]*$
我公认的对此的有限理解如下:
- 文字串
/path/foo
- 子匹配的任意数量的出现
/[^/]+
。基本上,0个或多个重复模式/
后跟一些目录名称(我知道文件路径中的空格或特殊字符的问题。我现在忽略了) - 不是文字字符串
/script
。因此,如果在(2)中重复了许多文件夹之后,接下来的事情是/script
,它失败了,假设它后面跟着...... - 字面意思
/
- 1 个或多个非
/
字符,后跟字符串的结尾。
但是,这不起作用。它似乎与以 . 开头的所有内容相匹配/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
推荐阅读
- ios - FetchEvent.respondWith 收到错误:返回的响应为空
- python - C socket recv 函数返回未定义的错误(errno)
- android - 回收站视图中未正确显示非英语(乌尔都语)文本
- html - 如何在具有绝对位置的 div 之后正确添加内容
- multithreading - Delphi 应用程序中的死锁
- python-3.x - 尽管已安装,但使用 Windows 导入 NumPy 失败
- django - 如果用户在单击验证电子邮件链接之前未登录,则电子邮件验证抛出错误
- swift - Swift 数组中的 didSet 和 Getter
- powershell - PowerShell - 如何强制超时调用命令
- python - 如何将 2 个 excel 与 pandas 合并