我想匹配“ AB”,如果“ A”后面不是B,则仅匹配“ A”
我用了perl regex:
A(*ACCEPT)??B
字符串“ AB”是很好的匹配,但是“ AC”却不返回“ A”。为什么?
我知道替代方法,但是我想用量词理解(* ACCEPT)。
我理解错了吗?谢谢你的帮助!
您指向的文档说:
(*ACCEPT)
是唯一可以量化的回溯动词,因为最小回零的不贪心的量化仅在发生回溯时才起作用。考虑例如
(A(*ACCEPT)??B)C
其中A,B和C可能是复杂的表达式。匹配“ A”后,匹配器处理“ BC”;如果失败,则导致回溯,
(*ACCEPT)
并且匹配成功。在这两种情况下,都捕获了除C外的所有内容。而(*COMMIT)
(见下文)表示“回溯失败”,而这种重复(*ACCEPT)
表示“在回溯成功”。
但是,(*ACCEPT)
似乎与回溯无关,您可以在示例中看到它。
因此,AC
不能与之匹配,A(*ACCEPT)??B
因为:
A
在模式中匹配A
字符串(*ACCEPT)??
首先被跳过,因为它被量化了B
不能C
在字符串中匹配,并且会失败。您希望发生回溯,但(*ACCEPT)??
不会触发回溯。
一个更有用的(*ACCPET)
用法示例:
(*ACCEPT)
我知道的唯一用例是,将交替的分支分配到并非所有分支都需要的更高版本的表达式中。例如,假设你想匹配任何模式的:BAZ
,BIZ
,BO
。您可以简单地编写
BAZ|BIZ|BO
,但是如果B
并且Z
代表复杂的子模式,则可能会寻找将B
andZ
模式分解的方法。第一遍可能会给您带来帮助B(?:AZ|IZ|O)
,但该解决方案并不考虑因素Z
。另一个选择是B(?:A|I)Z|BO
,但是它迫使您重复该操作B
。此模式允许您同时考虑B
和和Z
:B(?:A|I|O(*ACCEPT))Z
如果他的引擎遵循O分支,则它永远不会匹配,
BOZ
因为它会在遇到后BO
立即返回,(*ACCEPT)
这就是我们想要的。