虽然你可以用负向预测来做你想要的,但我不认为你需要它,你可以简单地使用零宽度原子\>
(参见:h /\>
)来描述单词的结尾。
\>
表示前一个字符是单词的最后一个字符(技术上说,是缓冲区本地选项'iskeyword'
内的最后一个字符)。
至于案例问题,您可以使用捕获组(请参阅:h /\(
)来捕获fall
和out
,以便您可以在替换命令的替换部分中引用它们。
它将给:
:%s/\v\c<(fall)\s+(out)>/\1\2/g
断下来了一点:
┌──────── capture `fall`
│ ┌ capture `out`
┌────┤ ┌───┤
%s/\v\c<(fall)\s+(out)>/\1\2/g
│ │
│ └─ use the text from the 2nd capturing group (will preserve the case)
└─ use the text from the 1st capturing group (will preserve the case)
\s+
描述的空白字符(至少一个)的序列。 \c
将使模式不区分大小写,并且\v
启用非常神奇的模式。没有它,你将不得不逃脱模式中的几个原子/量词。
编辑:
:%s/\v\c<fall\zs\s+\zeout>//g
拆毁了:
其实,你可以通过只删除空白的序列简化命令
%s/\v\c<fall\zs\s+\zeout>//g
│ │
│ └─ sets the end of the match
└─ sets the start of the match
这个时候,你用原子\zs
和\ze
来设置匹配的开始和结束。有关更多信息,请参见:h /\zs
和:h /\ze
。
用np ++例如使用['\ bfall out \ b'](https://regex101.com/r/NlgKPG/1)。如果感兴趣,请参阅[SO关于*字界线的文档](https://stackoverflow.com/documentation/regex/1539/word-boundary#t=201707302028316100317)。 –