Answers:
除了@jecxjo的答案外,在许多情况下,您可以使用零宽度锚点\zs而\ze不是正向环视。这些定位点在完整模式中定义了比赛的开始(\zs)和结束(\ze)。
foo\zsbar将匹配bar之前foo(foo不是匹配的一部分)foo\zebar将匹配foo后跟bar(bar不是匹配的一部分)myFunction(\zs.*\ze)将在函数调用中匹配参数(出于演示目的,我不关注贪婪与非贪婪匹配)这些在使用:substitute命令时变得最有用。例如,假设我想替换函数调用的参数myFunction()有foo:
:%s/myFunction(\zs.*\ze)/foo/
这将保留myFunction(并)保持不变,并且您不必担心会以您的样式捕获它们或在替换中重复它们。
您可以使用Vim的正则表达式的环视功能来做到这一点,但它很笨拙:
:%s/\(myFunction(\)\@<=.*\()\)\@=/foo/
(我发现这种语法使我忘记了最初要做的事情。)
在某些情况下,您需要环顾四周。使用\zs和\ze是伟大的,你有简单的情况下,一些前后面的文字进行匹配,然后之后的东西。但是,如果它比这更复杂,则您可能必须坚持使用较重的环顾语法。
尽管它们非常丑陋,但Vim的外观比PCRE中的外观更强大!它们支持可变长度的负向后看,这意味着您可以断言某个长度未预先确定的模式不在您的匹配之前。
PCRE不支持此功能,因为它在计算上相当昂贵。在Vim中,这并不是一个大问题,因为正则表达式最常见的用例往往涉及交互式搜索,其中用户几乎看不到计算时间。但是,如果将其用于语法高亮显示,您可能会注意到它。
:help \zs:help \ze:help perl-patterns看来这是可能的。从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)/