Vim:我如何搜索一个没有跟着另一个单词的单词?

时间:2008-09-18 20:52:55

标签: regex vim

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

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

我的第一直觉是尝试/abc [^\(defg\)]/abc [^\<defg\>],但这些都没有。

4 个答案:

答案 0 :(得分:44)

这是搜索字符串。

/abc \(defg\)\@!

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

:help \@!

答案 1 :(得分:15)

之前或之后是?

如果以'abc'开头的任何内容都没有(立即)后跟'defg',那么你需要bmdhacks' solution

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

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

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

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

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

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

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

虽然,如果您只是为了替换而执行此操作,可以通过合并:v//:s//

来简化此操作
:%v/defg/s/abc /<whatever>/g

这将替换'&lt; whatever&gt;'对于不包含'defg'的所有行的'abc'。有关详情,请参阅:help :v

答案 2 :(得分:0)

我们走了,这是一个多毛的:

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

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

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

这可能会像你想要的那样工作。希望这有点帮助!

答案 3 :(得分:-4)

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

对于较大的单词来说,这非常麻烦,但却像魅力一样。