(?=)
,(?!)
等。),但看来vim不支持此语法。 vim对这些类型的语句是否具有等效的语法?#1 楼
“缩放”锚点除了@jecxjo的答案外,在许多情况下,您可以使用零宽度锚点
\zs
和\ze
代替正向环视。这些定位点在完整模式中定义了匹配的开始(\zs
)和结束(\ze
)。 foo\zsbar
后面加bar
(foo
不是匹配项的一部分)foo
将匹配foo\zebar
,然后是foo
(bar
不是匹配项的一部分)bar
将匹配a中的参数函数调用(出于演示目的,我不关注贪婪和非贪婪匹配)将其使用
这些在使用时变得最有用
myFunction(\zs.*\ze)
命令。例如,说我想用:substitute
替换对myFunction()
的函数调用中的参数:不必担心会以您的样式捕获它们或在替换中重复它们。您可以使用Vim的正则表达式的环视功能来做到这一点,但是它很笨重: br />
(我发现此语法使我忘记了我最初想做的事情。)
有时您仍然需要环顾四周
那里仍然需要环顾四周的情况。使用
foo
和myFunction(
非常适合简单的情况,在这些情况下,您需要先输入一些内容,然后再匹配文本,然后再进行匹配。但是,如果它比这更复杂,则您可能必须坚持使用较重的环视语法。有趣的事实
尽管它们丑陋得多,但Vim的环顾更多比PCRE强大!它们支持可变长度的负向后看,这意味着您可以断言某个长度未预先确定的模式不在您的匹配之前。PCRE不支持此功能,因为它在计算上相当昂贵。在Vim中,这不是一个大问题,因为正则表达式最常见的用例往往涉及交互式搜索,而用户几乎看不到计算时间。但是,如果将其用于语法突出显示,则可能会注意到它。
相关帮助主题
)
\zs
\ze
#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)/
评论
我不知道变焦锚。感谢您的解释。
–EvergreenTree
15年4月22日在21:21