/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