テキスト比較ツール
テキスト比較とは?
テキスト差分ツールは、2 つのテキストを比較し、追加、削除、変更、未変更の行や部分を分かりやすく示すツールです。コード片、設定ファイル、翻訳、契約書の草案、Markdown 文書、プロンプトの版、リリースノート、ログ抜粋などを、左右で目視確認する負担を減らして確認できます。長い文章の中に小さな編集が紛れている場合や、空白、句読点、順序、書式が意図せず変わった可能性がある場合に特に有用です。ただし差分は内容の正しさを判断しません。どこが違うかを明確にし、レビューを集中させるための補助です。
使い方
使い方
- 左側の入力ボックスに元のテキストを貼り付けます
- 右側の入力ボックスに変更後のテキストを貼り付けます
- システムが自動的に差分を計算してハイライトし、ステータスバーに追加・削除行数が表示されます
レビューのヒント
- 実際の変更が内容の場合は、比較前に改行コードと空白を正規化してください。
- コードや法的文書では、ハイライトされた変更を手動で確認してください。自動差分は差異を表示するのみで、意図や正当性は判断しません。
利用シーン
仕組み
行レベルの差分比較は最長共通部分列(LCS)問題に基づいています。2つの行シーケンス A と B が与えられたとき、両方に同じ相対順序で出現する最長のシーケンスを見つけます。LCS に含まれないものはすべて、挿入(B にあるが A にない)または削除(A にあるが B にない)であり、これはサイドバイサイドビューで表示される赤と緑の行の集合と正確に対応します。素朴な LCS 動的計画法テーブルは O(M × N) の時間と空間を必要とします。ここで M と N は2つの入力の行数です。 実際には、diff エンジンは Myers 差分アルゴリズム(Eugene Myers、1986年)を使用しており、同じ問題を O((M + N) × D) の時間で解きます。D は2つのファイル間の編集距離です。大部分が同一の2つのファイルでは D が小さいため、Myers は完全な DP テーブルに比べて大幅に高速です。Git のデフォルトの diff バックエンド、GitHub の Web 差分ビュー、ほとんどの IDE の diff パネルはすべて、まさにこの理由から Myers またはその派生アルゴリズム(patience diff、histogram diff)を使用しています。Patience diff はさらに一意に出現する行を優先的にアライメントするため、コードブロックが移動された場合により読みやすいハンクを生成します。 出力は等価/挿入/削除操作のシーケンスであり、CLI ツールでは unified diff(@@ -m,n +p,q @@ ハンクヘッダーと各行に +/- プレフィックス)として、Web UI ではサイドバイサイドの色付き行として描画されます。文字レベルや単語レベルの差分は、より細粒度のシーケンスに同じアルゴリズムを適用したもので、置換を1つの操作としてカウントする必要がある場合は Levenshtein 距離(挿入 + 削除 + 置換コスト)と組み合わせることがあります。Neil Fraser による diff-match-patch ライブラリは、Web ベースの文字レベル差分の一般的なリファレンス実装です。
- LCS の基礎: 2つの行配列の最長共通部分列が変更されていない行を定義。それ以外はすべて挿入または削除
- Myers 差分(1986年): O((M + N) × D) の時間。D は編集距離。Git、GitHub、ほとんどの IDE の diff ビューのデフォルトバックエンド
- 素朴な DP: O(M × N) の時間と空間。小規模な入力には問題ないが、二次関数的なメモリ使用量により大きなファイルには非実用的
- Patience diff: 一意に出現する行を優先的にアライメント。移動や並べ替えられたブロックに対してよりクリーンなハンクを生成
- 出力形式: CLI 用の @@ -m,n +p,q @@ ハンクヘッダー付き unified diff。Web UI 用のサイドバイサイド色付き行
- 粒度: 行/単語/文字の差分は同じアルゴリズムを異なる入力の分割に適用
- Levenshtein 距離: 挿入 + 削除 + 置換をカウント。diff-match-patch は Web ライブラリのリファレンス実装
使用例
段落中の 1 単語の変更を発見
元のテキスト:
The server starts on port 3000 by default.
変更後:
The server starts on port 8080 by default.
結果: 1 行の変更(3000 -> 8080)設定ブロックの 2 バージョンを比較
元のテキスト: 変更後:
timeout: 30 timeout: 60
retries: 3 retries: 3
debug: false debug: true
log_level: info
結果: 2 行追加、2 行削除リリースノートの前後を差分比較
削除(赤):
- 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 行の変更(キー順が異なるが値は同一)よくある質問
どのような差分が表示されますか?
行レベルの差分です。本ページは2つのパネルを並べて表示します。左側では削除された行が赤でハイライトされ、右側では追加された行が緑でハイライトされます。行番号で変更位置を特定でき、ステータスバーには追加・削除された行数が表示されます。
どの差分アルゴリズムを使用していますか?
本ページは行レベルの編集スクリプトを計算するために Longest Common Subsequence(LCS)アルゴリズムを使用しています。一般的な文書サイズであれば入力中もリアルタイムに動作します。このアルゴリズムは、左のテキストを右のテキストに変換するための最短の挿入と削除のシーケンスを求めます。
git diff と表示が違うのはなぜ?
Git は独自の差分実装と設定可能なアルゴリズムを使用しています。本ページはブラウザ内で完結する JavaScript ベースの LCS 差分を使用します。出力フォーマットや hunk の境界が git diff とわずかに異なる場合がありますが、行レベルのテキスト比較における編集検出は正しく機能します。
段落や文の中だけで差分を取れますか?
はい。各バージョンを左右にそれぞれ貼り付けてください。本ページでは変更された行内の文字単位ハイライトも提供しており、これにより「foo を bar にリネーム」が無関係な2変更ではなくインライン置換として表示されます。
空白は無視されますか?
いいえ。差分はデフォルトで空白に敏感です。空白の違い(行末スペース、追加の空行、異なる改行コード)は変更として表示されます。
JSON や XML を構造的に比較できますか?
純粋なテキスト差分は行ベースです。キー単位で JSON を比較したい場合(同じ値で位置 1 から 3 に移動したキー 'a' = 変更なしと判定)、JSON 対応の差分ツール(jsondiffpatch、json-diff など)を使用してください。本ページはあくまでテキスト比較用です。
テキストはアップロードされますか?
いいえ。差分処理はブラウザ内で実行されます。両方の入力はローカルで処理され、送信されません。