快速入門
教學
工具和語言
範例
參考
書籍評論
範例
正規表示式範例
數字範圍
浮點數
電子郵件地址
IP 位址
有效日期
數字日期轉文字
信用卡號碼
比對完整行
刪除重複行
程式設計
兩個相鄰的字詞
陷阱
災難性的回溯
過多重複
拒絕服務
讓所有內容變成可選
重複擷取群組
混合 Unicode 和 8 位元
本網站的更多資訊
簡介
正規表示式快速入門
正規表示式教學
替換字串教學
應用程式和語言
正規表示式範例
正規表示式參考
替換字串參考
書籍評論
可列印 PDF
關於本網站
RSS 摘要和部落格
RegexBuddy—The most comprehensive regular expression library!

從檔案中刪除重複行

如果您有一個檔案,其中所有行都已排序(按字母順序或其他順序),您可以輕鬆刪除(連續)重複行。只要在 您最愛的文字編輯器 中開啟檔案,然後進行搜尋和替換,搜尋 ^(.*)(\r?\n\1)+$,並替換為 \1。為了讓此方法運作,錨定 需要在換行符號前後比對(而不仅仅在檔案或字串的開頭和結尾),而且 不得比對換行符號。

以下是其運作方式。插入符號 僅會在行開頭比對。因此,正規表示式引擎只會在那裡嘗試比對正規表示式的其餘部分。星號 組合只會比對整行,無論其內容為何(如果有)。括號 會將比對到的行儲存在第一個反向參考中。

接下來,我們將比對行分隔符號。我將 問號 放入 \r?\n,以讓此正規表示式同時適用於 Windows (\r\n) 和 UNIX (\n) 文字檔案。因此,到目前為止,我們已比對到一行及其後的換行符號。

現在,我們需要檢查這個組合後面是否接著該行的重複項。我們使用 \1 就能輕鬆做到。這是第一個反向參考,其中包含我們比對到的行。反向參考會比對完全相同的文字。

如果反向參照不匹配,正規表示式匹配和反向參照將被捨棄,正規表示式引擎將在下一行的開頭再次嘗試。如果反向參照成功,正規表示式中的加號符號將嘗試匹配該行的其他副本。最後,美元符號強制正規表示式引擎檢查反向參照匹配的文字是否為完整的一行。我們已經知道反向參照匹配的文字前面有一個換行符(由\r?\n匹配)。因此,我們現在檢查它後面是否也跟著一個換行符,或者它是否使用美元符號位於檔案的結尾。

整個匹配變為line\nline(或line\nline\nline等)。因為我們正在執行搜尋和替換,所以該行、它的副本以及它們之間的換行符都將從檔案中刪除。由於我們想要保留原始行,但不要保留副本,因此我們使用\1作為替換文字,以將原始行放回去。

從字串中移除重複的項目

我們可以將上述範例概括為afterseparator(item)(separator\1)+beforeseparator,其中afterseparatorbeforeseparator為零長度。因此,如果您想要從以逗號分隔的清單中移除連續的重複項,您可以使用(?<=,|^)([^,]*)(,\1)+(?=,|$)

正向後方展望(?<=,|^)強制正規表示式引擎在字串的開頭或逗號之後開始匹配。([^,]*)擷取項目。(,\1)+匹配連續的重複項目。最後,正向前方展望(?=,|$)透過檢查逗號或字串結尾來檢查重複的項目是否為完整的項目。