请考虑以下文本:首先,我们突出显示正则表达式/foobar/

foobarbaz




接下来,我们突出显示正则表达式/foobarbaz/

:syntax match Special /foobar/


此匹配项从与我们的Special组相同的位置开始,但是稍后定义,依此类推它具有优先权。 (请参阅`:help:syn-priority。)



现在让我们清除(:syntax clear Error),然后尝试通过使用bar设置\zs来突出显示比赛开始。

:syntax match Error /foobarbaz/




好的,这没用,但这也许是因为改变了比赛的开始,这场比赛现在开始在我们之前的小组中。如果是这种情况,我们可以使用containedin参数对其进行修复:

:syntax match Error /foo\zsbarbaz/




似乎奏效了!

现在让我们尝试从baz开始突出显示:

:syntax match Error /foo\zsbarbaz/ containedin=Special




呵呵。现在我们已经将Error比赛的开始移到了Special比赛的结束之后,它不再起作用。 (请注意,我没有使用contained参数,因此,即使Error组在Special组之外开始,它仍应匹配:删除containedin参数也没有任何作用。)

\zs中提到syntax.txt似乎无关紧要(它涉及多行模式),并且:help \zs也没有对此有所说明。

发生了什么事?

NB对于此特定示例,我可以使用hs语法模式偏移来实现所需的突出显示,而对于更复杂的正则表达式,我可以使用\@<=后向。但是出于性能方面的考虑,建议使用\zs而不是\@<=,无论如何,我仍然想了解该功能的工作原理。

评论

您是否能找到有关此的其他信息?这让我很感兴趣。

@SakariCajanus'containedin'允许项目在另一个组中开始;它不需要它。如果没有重叠,则无论是否设置了“ containedin”,最后一个示例都应该起作用。

我现在找不到参考,但是我记得发现这是因为\ zs仍“消耗”(从正则表达式引擎的角度来看)匹配之前的输入,而前瞻/后退则不

@ D.BenKnoble嗯。您能更具体地说明“消费”是什么意思吗?这如何解释问题中最后两个正则表达式的行为之间的区别?

当引擎“消费”文本时,即使其他内容可能匹配,它也不会返回并再次查看。即使我们使用\ zs,它也像文本是匹配的一部分。我可能无法很好地解释这一点,而且我还没有详细阅读您的q