消除重複的連續元素

假設我們想要從字串中消除重複的子序列元素(它可以不止一個)。例如:

2,14,14,14,19

並將其轉換為:

2,14,19

使用 gsub,我們可以實現它:

gsub("(\\d+)(,\\1)+","\\1", "2,14,14,14,19")
[1] "2,14,19"

它也適用於多個不同的重複,例如:

 > gsub("(\\d+)(,\\1)+", "\\1", "2,14,14,14,19,19,20,21")
[1] "2,14,19,20,21"

我們來解釋一下正規表示式:

  1. (\\d+):由()分隔的組 1,找到任何數字(至少一個)。記住我們需要在這裡使用雙反斜槓(\\),因為對於字元變數,反斜槓表示文字字串分隔符(\"\')的特殊轉義字元。\d\相當於:[0-9]
  2. ,:標點符號:,(我們可以包含空格或任何其他分隔符)
  3. \\1:與組 1 相同的字串,即:重複的數字。如果沒有發生,則模式不匹配。

讓我們嘗試類似的情況:消除連續重複的單詞:

one,two,two,three,four,four,five,six

然後,只需用\w 替換\d,其中\w 匹配任何單詞字元,包括:任何字母,數字或下劃線。它相當於 [a-zA-Z0-9_]

> gsub("(\\w+)(,\\1)+", "\\1", "one,two,two,three,four,four,five,six")
[1] "one,two,three,four,five,six"
> 

然後,上述模式包括作為特定情況的重複數字情況。