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

Dom*_*tos 35 regex vim

非常基本的问题,我正在尝试在Vim中编写一个正则表达式来匹配任何短语,"abc "然后直接跟着除了之外的任何其他短语"defg".

我习惯于"[^defg]"匹配除d,e,f或g之外的任何单个字符.

我的第一直觉是尝试/abc [^\(defg\)]或者/abc [^\<defg\>]两者都没有.

bmd*_*cks 48

这是搜索字符串.

/abc \(defg\)\@!
Run Code Online (Sandbox Code Playgroud)

您正在寻找的概念称为负面预测断言.在vim中尝试这个以获取更多信息:

:help \@!
Run Code Online (Sandbox Code Playgroud)


ram*_*ion 15

之前或之后?

如果以'abc'开头的任何东西都没有(立即)后跟'defg',那么你需要bmdhacks的解决方案.

如果以"abc"开头的任何东西都没有(立即)以'defg'开头,那么你需要一个负面的后视:

/\%(defg\)\@<!abc /
Run Code Online (Sandbox Code Playgroud)

这将匹配任何'abc'的出现,只要它不是'defgabc'的一部分.有关:help \@<!详细信息,请参阅

如果你想匹配'abc',只要它不是'defg.*abc'的一部分,那么只需添加一个.*:

/\%(defg.*\)\@<!abc /
Run Code Online (Sandbox Code Playgroud)

仅在'defg'未发生的行上匹配'abc'是类似的:

/\%(defg.*\)\@<!abc \%(.*defg\)\@!/
Run Code Online (Sandbox Code Playgroud)

虽然,如果您只是为了替换这样做,您可以通过组合:v//和使这更容易:s//

:%v/defg/s/abc /<whatever>/g
Run Code Online (Sandbox Code Playgroud)

这将在所有不包含'defg'的行上用'<whatever>'代替'abc'.了解:help :v更多.