文字去重工具
快速移除文字中的重複內容,支援按行、按詞、按句去重
什麼是文字去重?
文字去重工具用來刪除文字中重複的行、詞或項目,讓列表更乾淨、更容易檢查。它適合處理匯入的 CSV 片段、關鍵字列表、信箱集合、日誌片段、商品編碼、提示詞版本和筆記內容,這些重複項常來自複製、合併或匯出錯誤。真正需要注意的是比較規則:大小寫、首尾空格、空行、標點、正規化方式和原始順序都會影響兩個項目是否應被視為相同。工具能加快清理,但不能取代業務判斷;有些相似項目必須保留,小差異也可能代表不同含義。
使用方式
基本操作
- 在左側文字框中輸入或貼上要去重的文字
- 選擇適當的去重模式(按行、按詞、按句等)
- 依需要調整選項(區分大小寫、保留順序等)
- 在右側即時查看去重結果與統計資訊
- 點選複製按鈕將結果儲存到剪貼簿
模式說明
- 按行:將每行視為獨立單位,移除重複的行
- 按詞:以空格分割文字,移除重複的詞
- 按句:以句號、問號、驚嘆號分割,移除重複的句子
- 按段落:以空行分割,移除重複的段落
- 按字元:移除文字中重複出現的字元
使用場景
技術原理
去重是一次掃描,由 JavaScript Set 支援。ECMAScript Set 使用 SameValueZero 相等演算法(與 Array.prototype.includes 使用的比較方式相同,其中 NaN 等於 NaN 但 +0 等於 -0),且規範要求其提供次線性的平均查找效率 — V8 將其實現為開放定址雜湊表,具有攤銷 O(1) 的插入時間,因此整個掃描的時間複雜度為 O(n)。天真的替代方案 — 推入結果陣列並對每個元素呼叫 indexOf — 時間複雜度為 O(n²),在約一萬筆資料時就會明顯變慢。拆分方式因模式而異:行模式以 /\r?\n/ 拆分以同時處理 CRLF(Windows)和 LF(Unix)換行,詞模式以 /\s+/ 拆分,句模式以 /(?<=[.!?])\s+/ 拆分,段落模式以 /\n{2,}/ 拆分。每個單元在成為 Set 鍵值前會經過可選的正規化處理:trim() 移除首尾空白、toLowerCase() 用於不分大小寫匹配、String.prototype.normalize('NFC') 讓組合形式(é, U+00E9)和分解形式(e + U+0301)的視覺相同字串合併為同一筆。順序保留是免費的:結果陣列按迭代順序建立,Set 僅作為「我是否見過這個?」的過濾器。相同的資料結構選擇也支撐了 SQL DISTINCT 和 Python set();對於數千萬筆資料的唯一替代方案是機率性的布隆過濾器,它以極小的誤陽性率(約 10 bits/元素時 ≈1%)換取固定記憶體,但對瀏覽器端的文字工具而言過於誇張。
- Set 查找使用 SameValueZero 演算法(ECMA-262 §7.2.10)— NaN 匹配 NaN、+0 匹配 -0,其餘為嚴格相等
- V8 將 Set 實現為雜湊表;insert 和 has 的攤銷時間為 O(1),使整個去重為 O(n),相較於 indexOf 的 O(n²)
- 行模式正規表示式 /\r?\n/ 在一次拆分中處理 CRLF、LF 和尾部 CR;忽略此問題會留下看不見的 '\r' 尾綴導致精確匹配失敗
- 透過 String.prototype.normalize('NFC') 進行 Unicode 正規化,將組合/分解形式(如 'é' U+00E9 對比 'e' + U+0301)合併為同一鍵值
- 不分大小寫模式僅將鍵值小寫化 — 原始大小寫的值保留在輸出中,因此第一個 'ERROR' 會被原樣保留,後續的 'error' 行則被丟棄
- 順序保留是免費的:結果陣列按輸入順序建立,Set 僅作為過濾器,行為等同於 SQL DISTINCT 加穩定排序
- 對於超過一千萬筆資料、記憶體成為瓶頸的場景,布隆過濾器(約 10 bits/元素可達 1% 誤陽性率)可取代 Set — 在瀏覽器中不需要,因為一百萬筆字串的 Set 輕鬆控制在 100 MB 以內
範例
依行去重,保留首次出現
輸入:
apple
banana
apple
orange
banana
輸出:
apple
banana
orange去除前後空白後依行去重
輸入:
hello
hello
hello
world
輸出(去除空白後):
hello
world不分大小寫去重
輸入:
ERROR
error
Warning
WARNING
warning
輸出(不分大小寫):
ERROR
Warning擷取唯一電子郵件清單
輸入:
alice@example.com
bob@example.com
ALICE@example.com
carol@example.com
bob@example.com
輸出(不分大小寫,依行模式):
alice@example.com
bob@example.com
carol@example.com依單字去重
輸入:hello world hello again world
輸出:hello world again依句子去重
輸入:This is a test. This is a test. Another sentence.
輸出:This is a test. Another sentence.常見問題
什麼樣的內容會被視為重複?
每個單元(行、單字、句子、段落或字元)會與其他單元互相比對,完全相同的就算重複。可切換是否區分大小寫。本頁會輸出去重後的結果,並回報移除了幾個重複項。
會保留原本順序嗎?
會——每個唯一項目的第一次出現會留在原位置,後續的重複項則被刪除。輸出維持原本的順序。
空白行會被當作重複嗎?
空白行的比對方式與其他行一樣。第一個空白行會保留,後面遇到的相同空白行會與其他重複項一起刪除。
可以依子字串或欄位去重嗎?
不行。去重是針對每個單元(行、單字、句子、段落或字元)的完整內容進行比對,沒有依欄位或子字串去重的模式。
輸出會排序嗎?
不會。輸出始終保留原本順序,沒有排序選項。
可以處理多大的檔案?
瀏覽器的記憶體就是極限。桌上型瀏覽器處理數十萬行不成問題,數百萬行的檔案則會撐爆記憶體;遇到那種規模請改用 CLI 工具,例如 `sort -u` 或 `awk '!seen[$0]++'`。
我的文字會被上傳嗎?
不會。去重使用瀏覽器中的記憶體 Set 結構,貼上的內容不會被傳送出去。