vim :我怎样搜索一个后面没有另一个单词的单词?

0wi1tuuw  于 2022-11-11  发布在  其他
关注(0)|答案(5)|浏览(198)

非常基本的问题,我试图在Vim中编写一个正则表达式,以匹配任何以"abc "开头的短语,并直接后跟除"defg"以外的任何短语。
我使用"[^defg]"来匹配除d、e、f或g之外的任何单个字符。
我的第一直觉是尝试/abc [^\(defg\)]/abc [^\<defg\>],但这两种都不起作用。

qvk1mo1f

qvk1mo1f1#

这是搜索字符串。

/abc \(defg\)\@!

你要寻找的概念叫做否定前瞻Assert。请在vim中尝试以下语句以获取更多信息:

:help \@!
lzfw57am

lzfw57am2#

在前面还是后面?
如果它是以“abc”开头的任何东西,而不是(立即)后跟“defg”,那么你需要bmdhacks的解决方案。
如果它是以“abc”开头但前面没有(紧跟)“defg”的任何内容,则需要一个负lookbehind:

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

这将匹配任何出现的“abc”,只要它不是“defgabc”的一部分。有关详细信息,请参阅:help \@<!
如果你想匹配“abc”,只要它不是“defg.*abc”的一部分,那么只需添加一个.*

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

只在没有出现'defg'的行上匹配'abc '是类似的:

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

不过,如果只是为了替换而执行此操作,则可以通过组合:v//:s//来简化此操作

:%v/defg/s/abc /<whatever>/g

这将在所有不包含“defg”的行上用“”替换“abc”。有关详细信息,请参阅:help :v

zzlelutf

zzlelutf3#

来吧,这是一个毛茸茸的:

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

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

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

这可能会像你想要的那样工作。希望这能帮上一点忙!

eanckbw9

eanckbw94#

我没有足够的声誉来评论Andy的答案,但他的答案是错误的,所以我在这里解释一下,表达式”/abc\ [^d][^e][^f][^g]”与“abc d111”、“abc def 1”等不匹配。最好的方法是表达式“/abc(defg)@!”

fruv7luv

fruv7luv5#

/abc\ [^d][^e][^f][^g]
对于较大的单词来说,这是相当麻烦的,但工作起来就像一个魅力。

相关问题