Jon*_*ber 4 regex vim negative-lookahead
使用Vim,Notepad ++或Sublime我希望能够搜索和替换部分匹配.我认为这可以使用负面预测来完成,但我想征求社区的意见.
假设我想在以下示例中将"掉线"事件替换为"后果":
一个反例:
我想一个明显的匹配模式是:
fall out[^a-z]
但是,使用此匹配替换匹配中的"后果"会产生不良影响,即四个正例中的逗号,空格,句点和尾随引号将被删除.
人们通常如何处理这个问题,以及如何在比赛中保留上下套管?
虽然你可以用负面的前瞻做你想做的事情,但我认为你不需要它,你可以简单地使用零宽度原子\>(见: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了解更多信息.