正则表达式:替换正则表达式匹配的部分

Jon*_*ber 4 regex vim negative-lookahead

使用Vim,Notepad ++或Sublime我希望能够搜索和替换部分匹配.我认为这可以使用负面预测来完成,但我想征求社区的意见.

假设我想在以下示例中将"掉线"事件替换为"后果":

  • 他们担心核衰退和辐射.
  • 有堕落,然后有辐射.
  • 在长崎,一个最大的担忧是失败.
  • 2000年代最好的比赛之一是"失败".

一个反例:

  • 那将超出你的范围.

我想一个明显的匹配模式是:

fall out[^a-z]
Run Code Online (Sandbox Code Playgroud)

但是,使用此匹配替换匹配中的"后果"会产生不良影响,即四个正例中的逗号,空格,句点和尾随引号将被删除.

人们通常如何处理这个问题,以及如何在比赛中保留上下套管?

use*_*573 5

虽然你可以用负面的前瞻做你想做的事情,但我认为你不需要它,你可以简单地使用零宽度原子\>(见:h /\>)来描述一个单词的结尾.

\>表示前一个字符是单词的最后一个(技术上是缓冲区本地选项中的最后一个字符'iskeyword').

至于案件的问题,你可以使用捕获组(见:h /\()来捕获fallout,让您可以参考他们在更换部件的替换的命令.

它会给:

:%s/\v\c<(fall)\s+(out)>/\1\2/g
Run Code Online (Sandbox Code Playgroud)

分解一点:

             ????????? 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)
Run Code Online (Sandbox Code Playgroud)

\s+描述了一系列空白字符(至少一个). \c将使模式不区分大小写,并\v启用非常神奇的模式.没有它,你将不得不在模式中逃脱几个原子/量词.

编辑:

实际上,您可以通过删除空格序列来简化命令:

:%s/\v\c<fall\zs\s+\zeout>//g
Run Code Online (Sandbox Code Playgroud)

细分:

%s/\v\c<fall\zs\s+\zeout>//g
            ?     ?
            ?     ?? sets the end of the match
            ?? sets the start of the match
Run Code Online (Sandbox Code Playgroud)

这次,您使用原子\zs\ze设置匹配的开始和结束.请参阅:h /\zs:h /\ze了解更多信息.