我在vim中遇到过许多情况,其中具有环视语句会很有用。我试过使用标准的环顾四周语法((?=)(?!)等。),但看来vim不支持此语法。 vim对这些类型的语句是否具有等效的语法?

#1 楼

“缩放”锚点

除了@jecxjo的答案外,在许多情况下,您可以使用零宽度锚点\zs\ze代替正向环视。这些定位点在完整模式中定义了匹配的开始(\zs)和结束(\ze)。 foo\zsbar后面加barfoo不是匹配项的一部分)

foo将匹配foo\zebar,然后是foobar不是匹配项的一部分)

bar将匹配a中的参数函数调用(出于演示目的,我不关注贪婪和非贪婪匹配)


将其使用

这些在使用时变得最有用myFunction(\zs.*\ze)命令。例如,说我想用:substitute替换对myFunction()的函数调用中的参数:不必担心会以您的样式捕获它们或在替换中重复它们。

您可以使用Vim的正则表达式的环视功能来做到这一点,但是它很笨重: br />
(我发现此语法使我忘记了我最初想做的事情。)

有时您仍然需要环顾四周

那里仍然需要环顾四周的情况。使用foomyFunction(非常适合简单的情况,在这些情况下,您需要先输入一些内容,然后再匹配文本,然后再进行匹配。但是,如果它比这更复杂,则您可能必须坚持使用较重的环视语法。

有趣的事实

尽管它们丑陋得多,但Vim的环顾更多比PCRE强大!它们支持可变长度的负向后看,这意味着您可以断言某个长度未预先确定的模式不在您的匹配之前。PCRE不支持此功能,因为它在计算上相当昂贵。在Vim中,这不是一个大问题,因为正则表达式最常见的用例往往涉及交互式搜索,而用户几乎看不到计算时间。但是,如果将其用于语法突出显示,则可能会注意到它。

相关帮助主题


)
\zs
\ze


评论


我不知道变焦锚。感谢您的解释。

–EvergreenTree
15年4月22日在21:21

#2 楼

看来这是可能的。从perl到vim有一个简单的表。 :h perl-patterns

9. Compare with Perl patterns               *perl-patterns*

Vim's regexes are most similar to Perl's, in terms of what you can do.  The
difference between them is mostly just notation;  here's a summary of where
they differ:

Capability                  in Vimspeak   in Perlspeak
----------------------------------------------------------------
force case insensitivity    \c            (?i)
force case sensitivity      \C            (?-i)
backref-less grouping       \%(atom\)     (?:atom)
conservative quantifiers    \{-n,m}       *?, +?, ??, {}?
0-width match               atom\@=       (?=atom)
0-width non-match           atom\@!       (?!atom)
0-width preceding match     atom\@<=      (?<=atom)
0-width preceding non-match atom\@<!      (?<!atom)
match without retry         atom\@>       (?>atom)


因此,例如,如果您具有字符串one two three,并且仅当one紧随其后才想与<space>two匹配,则可以使用
/one\(\stwo\)\@=


这类似于perl版本

m/one(?=\stwo)/