文本對比工具
什麼是文字對比?
文字差異工具用來比較兩段文字,標出哪些行或片段被新增、刪除、修改或保持不變。它適合檢查程式碼片段、設定檔、翻譯文案、合約草稿、Markdown 檔案、提示詞版本、發布說明和日誌內容,不必人工逐行對照兩份文字。尤其當長內容中只改了很小一處,或空格、標點、順序、格式可能被意外影響時,差異視圖能快速定位問題。需要注意的是,Diff 不會判斷新版本是否正確,它只負責清楚展示哪裡不同,方便你把審查精力放在真正需要判斷的地方。
使用方式
使用方式
- 在左側輸入框貼上原始文字
- 在右側輸入框貼上修改後的文字
- 系統會自動計算並高亮顯示差異,狀態列會顯示新增與刪除的行數
檢視提示
- 當實際變更為內容而非格式時,請在比較前先統一行尾符號與空白字元。
- 對於程式碼或法律文件,請手動檢視高亮標示的變更;自動差異比對僅顯示差異,不會判斷意圖或正確性。
使用場景
技術原理
行級差異比對建立在最長公共子序列(LCS)問題之上:給定兩個行序列 A 和 B,找出在兩者中以相同相對順序出現的最長序列。不在 LCS 中的部分要麼是插入(存在於 B 但不存在於 A),要麼是刪除(存在於 A 但不存在於 B),這正是並排視圖中紅色和綠色行所顯示的內容。朴素的 LCS 動態規劃表的時間和空間複雜度為 O(M × N),其中 M 和 N 分別是兩個輸入的行數。 實際的差異引擎使用 Myers 差異演算法(Eugene Myers,1986),它以 O((M + N) × D) 的時間解決同一問題,其中 D 是兩個檔案之間的編輯距離。對於兩個大部分相同的檔案,D 值很小,Myers 演算法比完整的 DP 表快得多;Git 的預設差異後端、GitHub 的網頁差異檢視以及大多數 IDE 的差異面板都使用 Myers 或其衍生版本(patience diff、histogram diff),正是出於這個原因。Patience diff 會優先對齊唯一出現的行,這在程式碼區塊被移動或重新排序時能產生更易讀的差異區塊。 輸出是一系列相等/插入/刪除操作,在 CLI 工具中渲染為統一差異格式(帶有 @@ -m,n +p,q @@ 區塊標頭和每行的 +/- 前綴),在 Web UI 中渲染為並排的彩色行。字元級或詞級差異在更細粒度的序列上使用相同演算法,當需要將替換計為單一操作時,通常搭配 Levenshtein 距離(插入 + 刪除 + 替換代價)。Neil Fraser 的 diff-match-patch 函式庫是基於網頁的字元級差異的通用參考實現。
- LCS 基礎:兩個行陣列的最長公共子序列定義了未變更的行;其餘部分為插入或刪除
- Myers 差異演算法(1986):O((M + N) × D) 時間,其中 D 為編輯距離;Git、GitHub 和大多數 IDE 差異檢視的預設後端
- 朴素 DP:O(M × N) 時間和空間——適用於小型輸入,但二次方記憶體使其不適用於大型檔案
- Patience diff:優先對齊唯一出現的行;對於移動或重新排序的區塊能產生更乾淨的差異區塊
- 輸出格式:CLI 使用帶有 @@ -m,n +p,q @@ 區塊標頭的統一差異;Web UI 使用並排彩色行
- 粒度:行級/詞級/字元級差異將相同演算法應用於輸入的不同分段
- Levenshtein 距離:計算插入 + 刪除 + 替換次數;diff-match-patch 是通用的網頁函式庫
範例
找出段落中單一字詞的差異
原始:
The server starts on port 3000 by default.
修改後:
The server starts on port 8080 by default.
結果:1 行有變更(3000 -> 8080)比較兩個版本的設定區塊
原始: 修改後:
timeout: 30 timeout: 60
retries: 3 retries: 3
debug: false debug: true
log_level: info
結果:新增 2 行,移除 2 行比對發布前後的 release notes
移除(紅色):
- Fixed login redirect on Safari 16
新增(綠色):
- Fixed login redirect on Safari 16 and 17
- Added dark mode preference sync
結果:新增 2 行,移除 1 行偵測 JSON 鍵的順序變動
原始: 修改後:
{ "name": "alice", { "id": 1,
"id": 1, "name": "alice",
"role": "admin" } "role": "admin" }
結果:2 行有變更(鍵順序不同,值相同)常見問題
顯示的是哪種層級的差異?
行層級的差異比對。頁面以左右雙面板呈現:左側用紅色標示刪除的行,右側用綠色標示新增的行。行號方便定位變動,狀態列會顯示新增與刪除的行數統計。
使用什麼比對演算法?
本頁使用最長共同子序列(LCS)演算法在行層級計算編輯腳本。在一般檔案大小下,輸入的同時就能即時比對。演算法會找出將左側文字轉換為右側文字所需的最短插入與刪除序列。
為什麼比對結果和 git diff 看起來不一樣?
Git 有自家的 diff 實作,並可選擇不同演算法。本頁使用基於 LCS、完全在瀏覽器中執行的 JavaScript diff。輸出格式與差異區塊的邊界可能與 git diff 略有不同,但底層的編輯偵測在行層級的文字比對上是正確的。
可以只比對某段或某句話嗎?
可以——把每個版本分別貼到一側。本頁也支援在變動行內做字元層級的高亮,這就是為什麼「把 foo 改名為 bar」能顯示成行內替換,而不是兩處不相關的變動。
會忽略空白嗎?
不會。比對預設對空白敏感,空白差異(行尾空白、多餘空行、不同的換行符)都會被視為變動顯示出來。
可以對 JSON 或 XML 做結構性比對嗎?
純文字 diff 是基於行的。如果想以 JSON 為單位來判斷(例如 key「a」從第 1 個位置移到第 3 個位置但值不變應視為無變動),請使用支援 JSON 的 diff 工具(jsondiffpatch、json-diff)。本頁僅做文字層面的比較。
我的文字會被上傳嗎?
不會。差異比對在您的瀏覽器中執行,兩邊輸入都在本機處理,不會被傳送出去。