vim的正则表达式系统中可以环顾四周吗?


22

我在vim中遇到过许多情况,其中具有环顾四周的语句将很有用。我已经使用标准环视语法试过(?=)(?!)等..) ,但它似乎Vim不支持此功能。vim对这些类型的语句是否具有等效的语法?

Answers:


29

“缩放”锚点

除了@jecxjo的答案外,在许多情况下,您可以使用零宽度锚点\zs\ze不是正向环视。这些定位点在完整模式中定义了比赛的开始(\zs)和结束(\ze)。

例子

  • foo\zsbar将匹配bar之前foofoo不是匹配的一部分)
  • foo\zebar将匹配foo后跟barbar不是匹配的一部分)
  • 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

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

14

看来这是可能的。从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)/
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.