非常基本的问题,我正在尝试在 Vim 中编写一个正则表达式来匹配任何以"abc "
直接开头的短语,然后是"defg"
.
我曾经"[^defg]"
匹配除 d、e、f 或 g 之外的任何单个字符。
我的第一个直觉是尝试这些作品,/abc [^\(defg\)]
或者两者都没有。/abc [^\<defg\>]
这是搜索字符串。
/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
更多。
我们走吧,这是一个毛茸茸的:
/\%(\%(.\{-}\)\@<=XXXXXX\zs\)*
(将 XXXXXX 替换为搜索词)。这将搜索不包含 XXXXXX 的所有内容。我想如果你这样做:
/abc \%(\%(.\{-}\)\@<=defg\zs\)*
这可能会像您希望的那样工作。希望这有所帮助!
/abc\ [^d][^e][^f][^g]
对于较大的单词来说这很麻烦,但它就像一个魅力。