Vim:如何从搜索中排除整个单词?

时间:2020-03-06 14:23:26  来源:igfitidea点击:

一个非常基本的问题,我正在尝试在Vim中编写一个正则表达式,以匹配以" abc"开头的任何短语,然后直接以除" defg"之外的任何内容匹配。

我已经使用" [^ defg]"来匹配d,e,f或者g以外的任何单个字符。

我的第一个直觉是尝试/ abc [^ \(defg \)]或者/ abc [^ \ <defg \>],但是这些都不起作用。

解决方案

我们开始,这是一个多毛的:

/\%(\%(.\{-}\)\<@=XXXXXX\zs\)*

(用搜索词替换XXXXXX)。这将搜索不包含XXXXXX的所有内容。我想如果我们这样做:

/abc \%(\%(.\{-}\)\<@=defg\zs\)*

这可能像我们希望的那样工作。希望这有所帮助!

/ abc \ [^ d] [^ e] [^ f] [^ g]

对于较大的单词来说这很麻烦,但是却像是一种魅力。

这是搜索字符串。

/abc \(defg\)\@!

我们要查找的概念称为否定超前断言。在vim中尝试此操作以获取更多信息:

:help \@!

之前还是之后?

如果不是以" abc"开头的(不是)紧随其后的是" defg",则需要bmdhacks的解决方案。

如果不是以(abc)开头的任何东西(不是立即以'defg'开头),则需要在后面进行否定查找:

/\%(defg\)\<@!abc /

只要它不是'defgabc'的一部分,它将匹配任何'abc'的出现。有关更多详细信息,请参见:help \ @ &lt;!

如果我们想匹配'abc',只要它不属于'defg。* abc'的一部分,则只需添加一个'。*`:

/\%(defg.*\)\<@!abc /

仅在未出现" defg"的行上匹配" abc"是类似的:

/\%(defg.*\)\<@!abc \%(.*defg\)\@!/

虽然,如果我们只是为了替换而做,则可以通过结合使用:v //:s //来简化操作

:%v/defg/s/abc /<whatever>/g

这将在所有不包含" defg"的行上将" <whatever>"替换为" abc"。有关更多信息,请参见:help:v