2017-07-30 266 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