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)/