2017-07-30 268 views
4

使用Vim,Notepad ++或Sublime我希望能够搜索并替换部分的匹配。我认为这可以使用负面看法来完成,但我想征求社区的意见。正则表达式:替换部分正则表达式匹配

说我想在下面的示例来代替“脱离”与“辐射”事件:

  • 他们担心放射性落下灰和辐射。
  • 有跌倒,然后有辐射。
  • 在长崎,最大的担忧之一是跌倒。
  • 21世纪最好的游戏之一是“掉出”。

一个反例:

  • 将属于你的范围之外。

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

fall out[^a-z] 

但随着“辐射”这个比赛中换人比赛在这里将有不良影响,即逗号,空间,周期和尾随引号中四个正面的例子将被删除。

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

+1

用np ++例如使用['\ bfall out \ b'](https://regex101.com/r/NlgKPG/1)。如果感兴趣,请参阅[SO关于*字界线的文档](https://stackoverflow.com/documentation/regex/1539/word-boundary#t=201707302028316100317)。 –

回答

5

虽然你可以用负向预测来做你想要的,但我不认为你需要它,你可以简单地使用零宽度原子\>(参见:h /\>)来描述单词的结尾。

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

至于案例问题,您可以使用捕获组(请参阅:h /\()来捕获fallout,以便您可以在替换命令的替换部分中引用它们。

它将给:

:%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

+0

超级有希望,并有详细的解释,但是这不仅适用于Vim吗? – JonasJSchreiber

+0

@JonasJSchreiber对,对不起。我错过了你的问题比Vim更普遍的事实。不幸的是,我不知道其他编辑器中的正则表达式引擎是如何工作的,所以我不确定添加更多关于它们的信息。不过,我认为无论您使用哪种编辑器,您需要查找的关键字都是“捕获组”,“文字边界”和“反向引用”。这些构造的符号可能会不同于正则表达式引擎,但它们的目的应该是相同的。 – user852573

+0

@JonasJSchreiber例如,在崇高中,我认为括号可以用来表达一个捕获组,就像在Vim中一样。 '\ 1'和'\ 2'可能可以用作替换部分的反向引用。唯一不同的是字的界限,在崇高中它应该是'\ b',而在Vim中则是'\ <' and '\>'。但重要的是,恕我直言,不是结构本身,而是它们的意义。结构可能会改变,但通常意义将保持不变。 – user852573