VIM 界定匹配的边界

1. 界定匹配的边界

::: alert-info

有时候,可能想指定一个范围较广的模式,但只对匹配结果的一部分感兴趣。Vim中的元字符 \zs与 \ze可以帮助我们处理这种情况
:::

测试文本:
Match "quoted words"---not quote marks
如果想找到双引号的之中的内容使用以下匹配:

/\v"[^"]+"

把引号排除:


/\v"\zs[^"]+\ze"
按键操作 缓冲区内容 Match "quoted words"---not quote marks. /\v"[^"]+" Match "quoted words"---not quote marks. /\v"\zs[^"]+\ze" Match "quoted words"---not quote marks.

尽管引号被排除在匹配之外,但它们仍然是模式中的关键部分。

::: alert-info

环视表达式

从概念上讲,Vim的元字符 \zs与 \ze类似于Perl的环视断言。尽管Perl与Vim的正则表达式引擎在语法上有所不同,但从功能上讲,元字符 \zs和 \ze分别大致相当于肯定型逆序环视和肯定型顺序环视。

正如你可能期望的那样,Perl也提供环视断言的否定型变体。只有当指定的模式不存在时,这些零宽度元字符才会发生匹配。Vim也提供完整的否定型/肯定型顺序环视/逆序环视断言,但我要再一次提醒大家,其语法与Perl的语法有所区别。关于二者逐项对比的情况,请查阅 :h perl-patterns[2]。

我们将使用正向环视元字符代替 \zs 与 \ze,重写技巧78中的模式 /\v"\zs[^"]+\ze",就像这样:

➾ /\v"@<=[^"]+"@=
我不知道你是怎么想的,反正我觉得使用 \zs与 \ze的版本可读性更强。尽管否定型环视表达式被广泛用于一些Vim的语法高亮定义,但在我的日常使用过程中却不多见。相反地,我发现肯定型环视表达式的使用频率会更高,因此,在我看来,它们应该拥有自己的速记标记,即 \zs与 \ze。
:::