非常基本的问题,我正在尝试在Vim中编写一个正则表达式,以匹配以"abc "
开头的任何短语,后跟除"defg"
之外的任何其他短语。
我使用"[^defg]"
来匹配除d,e,f或g之外的任何单个字符。
我的第一直觉是尝试/abc [^\(defg\)]
或/abc [^\<defg\>]
,但这些都没有。
答案 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]
对于较大的单词来说,这非常麻烦,但却像魅力一样。