Regular-Expression

在 VIM 中加入一個組的所有匹配項

  • May 25, 2018

我正在嘗試編寫一個替換命令,該命令將搜尋包含至少 4 個由空格分隔的字母的文本並刪除空格:

%s/\v%(([a-zA-Z])\s){3,}([a-zA-Z])/\1\2/gc

L i g ht

變成

ght

正如預期的那樣,因為一個組僅包含g在這種情況下的最後一個匹配項。如何累積所有組的匹配\1然後加入它們?

給定一個像(...){n,m}or這樣的重複組(...)+,我認為 Vim 沒有辦法提取該組的每次出現。只有最後一個在所有與正則表達式相關的函式和命令中可用。

也就是說,您可以使用嵌套替換:

:s/\v%([a-zA-Z]\s){3,}[a-zA-Z]/\=substitute(submatch(0), '\s', '', 'g')/gc

\=替換中的A:s使 Vim 將替換作為表達式計算。在該表達式中,我使用該函式刪除(由 獲得)substitute()的整個匹配文本中的所有空格,從.:ssubmatch(0)Ligh``L i g h

引用自:https://unix.stackexchange.com/questions/445959