非常基本的问题,我试图在Vim中编写一个正则表达式,以匹配任何以"abc "开头的短语,并直接后跟除"defg"以外的任何短语。我使用"[^defg]"来匹配除d、e、f或g之外的任何单个字符。我的第一直觉是尝试/abc [^\(defg\)]或/abc [^\<defg\>],但这两种都不起作用。
"abc "
"defg"
"[^defg]"
/abc [^\(defg\)]
/abc [^\<defg\>]
qvk1mo1f1#
这是搜索字符串。
/abc \(defg\)\@!
你要寻找的概念叫做否定前瞻Assert。请在vim中尝试以下语句以获取更多信息:
:help \@!
lzfw57am2#
在前面还是后面?如果它是以“abc”开头的任何东西,而不是(立即)后跟“defg”,那么你需要bmdhacks的解决方案。如果它是以“abc”开头但前面没有(紧跟)“defg”的任何内容,则需要一个负lookbehind:
/\%(defg\)\@<!abc /
这将匹配任何出现的“abc”,只要它不是“defgabc”的一部分。有关详细信息,请参阅:help \@<!。如果你想匹配“abc”,只要它不是“defg.*abc”的一部分,那么只需添加一个.*:
:help \@<!
.*
/\%(defg.*\)\@<!abc /
只在没有出现'defg'的行上匹配'abc '是类似的:
/\%(defg.*\)\@<!abc \%(.*defg\)\@!/
不过,如果只是为了替换而执行此操作,则可以通过组合:v//和:s//来简化此操作
:v//
:s//
:%v/defg/s/abc /<whatever>/g
这将在所有不包含“defg”的行上用“”替换“abc”。有关详细信息,请参阅:help :v。
:help :v
zzlelutf3#
来吧,这是一个毛茸茸的:
/\%(\%(.\{-}\)\@<=XXXXXX\zs\)*
(将XXXXXX替换为搜索词)。这将搜索 * 不 * 包含XXXXXX的所有内容。我想如果您这样做:
/abc \%(\%(.\{-}\)\@<=defg\zs\)*
这可能会像你想要的那样工作。希望这能帮上一点忙!
eanckbw94#
我没有足够的声誉来评论Andy的答案,但他的答案是错误的,所以我在这里解释一下,表达式”/abc\ [^d][^e][^f][^g]”与“abc d111”、“abc def 1”等不匹配。最好的方法是表达式“/abc(defg)@!”
fruv7luv5#
/abc\ [^d][^e][^f][^g]对于较大的单词来说,这是相当麻烦的,但工作起来就像一个魅力。
5条答案
按热度按时间qvk1mo1f1#
这是搜索字符串。
你要寻找的概念叫做否定前瞻Assert。请在vim中尝试以下语句以获取更多信息:
lzfw57am2#
在前面还是后面?
如果它是以“abc”开头的任何东西,而不是(立即)后跟“defg”,那么你需要bmdhacks的解决方案。
如果它是以“abc”开头但前面没有(紧跟)“defg”的任何内容,则需要一个负lookbehind:
这将匹配任何出现的“abc”,只要它不是“defgabc”的一部分。有关详细信息,请参阅
:help \@<!
。如果你想匹配“abc”,只要它不是“defg.*abc”的一部分,那么只需添加一个
.*
:只在没有出现'defg'的行上匹配'abc '是类似的:
不过,如果只是为了替换而执行此操作,则可以通过组合
:v//
和:s//
来简化此操作这将在所有不包含“defg”的行上用“”替换“abc”。有关详细信息,请参阅
:help :v
。zzlelutf3#
来吧,这是一个毛茸茸的:
(将XXXXXX替换为搜索词)。这将搜索 * 不 * 包含XXXXXX的所有内容。我想如果您这样做:
这可能会像你想要的那样工作。希望这能帮上一点忙!
eanckbw94#
我没有足够的声誉来评论Andy的答案,但他的答案是错误的,所以我在这里解释一下,表达式”/abc\ [^d][^e][^f][^g]”与“abc d111”、“abc def 1”等不匹配。最好的方法是表达式“/abc(defg)@!”
fruv7luv5#
/abc\ [^d][^e][^f][^g]
对于较大的单词来说,这是相当麻烦的,但工作起来就像一个魅力。