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 \ @ <!
。
如果我们想匹配'abc',只要它不属于'defg。* abc'的一部分,则只需添加一个'。*`:
/\%(defg.*\)\<@!abc /
仅在未出现" defg"的行上匹配" abc"是类似的:
/\%(defg.*\)\<@!abc \%(.*defg\)\@!/
虽然,如果我们只是为了替换而做,则可以通过结合使用:v //
和:s //
来简化操作
:%v/defg/s/abc /<whatever>/g
这将在所有不包含" defg"的行上将" <whatever>"替换为" abc"。有关更多信息,请参见:help:v
。