Java 正则表达式:量化非捕获组
请参阅,了解我正在尝试做的一些背景知识。简而言之,我想匹配Java 正则表达式:量化非捕获组,java,regex,Java,Regex,请参阅,了解我正在尝试做的一些背景知识。简而言之,我想匹配/path/foo/下的任何路径,除非叶目录(不是叶文件)是脚本 在这个问题上有一些答案似乎是有效的,但我试图找出为什么我尝试的某个解决方案不起作用。正则表达式如下所示: ^/path/foo(?:/[^/]+)*(?!/script)/[^/]*$ 无可否认,我对这一点的有限理解如下: 文本字符串/path/foo 子匹配出现的任意次数/[^/]+。基本上,0个或更多重复模式的/,后跟一些目录名(我知道文件路径中存在空格或特殊字符的问
/path/foo/
下的任何路径,除非叶目录(不是叶文件)是脚本
在这个问题上有一些答案似乎是有效的,但我试图找出为什么我尝试的某个解决方案不起作用。正则表达式如下所示:
^/path/foo(?:/[^/]+)*(?!/script)/[^/]*$
无可否认,我对这一点的有限理解如下:
/path/foo
/[^/]+
。基本上,0个或更多重复模式的/
,后跟一些目录名(我知道文件路径中存在空格或特殊字符的问题。我现在忽略这些)/script
。因此,如果在(2)中重复了多少个文件夹之后,下一件事是/script
,那么它失败了,假设它后面跟着/
/
字符,后跟字符串的结尾/path/foo
开头的所有内容
这个正则表达式有什么问题?考虑输入:
/path/foo/a/b/script/file
正则表达式匹配如下:
^Ok:此处前面没有文本
/路径/foo“/路径/foo”
(?:/[^/]+)*“/a/b/script”
(?!/script)确定:此处后面的文本为“/文件”
/ "/"
[^/]*“文件”
$Ok:此处后面没有文本
你想要的是消极的回顾,而不是消极的前瞻:
^Ok:此处前面没有文本
/路径/foo“/路径/foo”
(?:/[^/]+)*“/a/b/script”
(?考虑输入:
/path/foo/a/b/script/file
正则表达式匹配如下:
^Ok:此处前面没有文本
/路径/foo“/路径/foo”
(?:/[^/]+)*“/a/b/script”
(?!/script)确定:此处后面的文本为“/文件”
/ "/"
[^/]*“文件”
$Ok:此处后面没有文本
你想要的是消极的回顾,而不是消极的前瞻:
^Ok:此处前面没有文本
/路径/foo“/路径/foo”
(?:/[^/]+)*“/a/b/script”
(?答案是回溯。*
使正则表达式引擎可以在当前尝试失败时选择其他匹配路径,例如负前瞻。基本上,始终注意非所有格量词后的负前瞻。@WiktorStribiżew“选择其他匹配路径”是什么意思?它找到的其他匹配路径是什么?Andreas发布了一个有效匹配路径的示例。答案是回溯。*
使正则表达式引擎可以在当前尝试失败时选择其他匹配路径,例如负前瞻。基本上,在非po之后始终注意负前瞻s被动量词。@WiktorStribiżew“选择其他匹配路径”是什么意思?它找到的其他匹配路径是什么?Andreas发布了一个有效匹配路径的示例。