47

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

我曾经"[^defg]"匹配除 d、e、f 或 g 之外的任何单个字符。

我的第一个直觉是尝试这些作品,/abc [^\(defg\)]或者两者都没有。/abc [^\<defg\>]

4

4 回答 4

59

这是搜索字符串。

/abc \(defg\)\@!

您正在寻找的概念称为负前瞻断言。在 vim 中试试这个以获取更多信息:

:help \@!
于 2008-09-18T21:09:43.087 回答
18

之前还是之后?

如果是以 '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更多。

于 2008-09-19T03:00:46.957 回答
0

我们走吧,这是一个毛茸茸的:

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

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

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

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

于 2008-09-18T21:03:51.417 回答
-4

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

对于较大的单词来说这很麻烦,但它就像一个魅力。

于 2008-09-18T21:06:16.310 回答