テキスト比較と差分検出
2 つのテキストをブラウザ内で即座に比較。並列ビュー、行内の単語レベルハイライト、統一 diff のエクスポート、大文字小文字・空白・空行の無視に対応。完全ブラウザ内処理でアップロード不要、テキストは端末から出ません。
無視オプション
テキスト比較とは?
テキスト比較とは、2 つのテキスト文書を構造的に比較し、一方を他方に変換するために必要な最小限の挿入と削除の集合を求める処理です。出力は変更を可視化します。追加行は緑、削除行は赤、並列表示または `git`、GitHub、Unix の `patch` コマンドが使う `---/+++/@@` 統一パッチ形式で表示されます。
内部的に、現代の diff はほぼすべて最長共通部分列(LCS)アルゴリズムです。Eugene Myers の 1986 年の O((N+M)D) 論文は効率的実装の定番で、本ツールが用いる古典的な動的計画法(前後の共通部分を切り落とす最適化付き)はよりシンプルで、典型的な Web 入力には十分機能します。行単位で揃った後、隣接する削除 + 追加ペアは 2 段目のトークンレベル LCS にかけられ、レンダラは行内で実際に変わった単語だけをハイライトできます。これがレビュアーが言う行内 diff、または単語レベル diff です。
なぜ文字単位の比較で済まないか? 編集は通常フラットではないからです。200 行のファイルの中央に 1 行挿入すると、それ以降の全行がずれます。素朴な `===` は 199 行すべてを「異なる」と判定します。LCS は真実を伝えます。追加は 1 行、199 行は変わっていません。
このツールはすべての比較をブラウザ内で実行します。アップロードなし、一時ファイルなし、ログなし。専有コード、赤入れ中の契約書、機密のログ —— 第三者サーバーに貼り付けたくないものに対して安全です。代わりに JSON を diff したい? 構造化された JSON Diff をご利用ください。キーの順序や空白がノイズになりません。YAML や CSV の設定ファイルを比較する場合は、まず YAML → JSON や JSON → CSV で変換し、形式に合った diff ツールを使ってください。
// Two strings that look 'mostly the same' but a naïve check disagrees const a = 'hello world'; const b = 'hello, world!'; // Character equality a === b; // false — but only 3 characters actually changed. // LCS-style diff (this tool, at line + word granularity) // → 1 line modified, inline highlight: 'hello[, ]world[!]' // → unified patch: // --- original // +++ modified // @@ -1 +1 @@ // -hello world // +hello, world!
主な機能
並列表示 + 統一表示
人間のレビュー向けの 2 列ビジュアルビューと、`git apply`、コードレビューツール、バグレポート用の標準的な統一 diff パッチ形式を切り替えられます。
行内の単語レベルハイライト
2 つの行が「変更」としてペアになると、変わったトークンだけに色付き背景が付きます。80 文字を目で追わなくても、編集箇所にすぐ気づけます。
大文字小文字 / 空白 / 空行の無視
独立した 4 つのトグル: 大文字小文字、すべての空白、行末空白のみ、空行。`git diff -i -w -b` を数クリックで再現できます。
統一 diff のエクスポート
前後 3 行のコンテキスト付きのクリーンな `---/+++/@@` パッチをコピー。PR コメント、バグレポート、`patch -p1` にそのまま貼り付けられます。
100% ブラウザ内処理
入力は端末から出ません。アップロードなし、テキストに対する解析もなし。ページ読み込み後はオフラインで動作。専有コードや機密文書も安全です。
Unicode と RTL に対応
Unicode の単語境界でトークンを分割。アラビア語、ヘブライ語、CJK のコンテンツもきれいに比較でき、改行コード(CRLF、LF、CR)はすべて正規化されます。
サンプル
コードレビュー — 変数名のリネーム
function getUser(id) {
const u = db.users.find(x => x.id === id);
return u;
} function getUser(userId) {
const u = db.users.find(x => x.id === userId);
return u;
} 並列ビューはリネームを含む各行をハイライトし、行内 word diff は変更されていないトークンを薄く表示するため、どの識別子が変わったかが一目で分かります。
契約書の修正 — 条項を 1 つ追加
1. The service is provided as-is. 2. Either party may terminate with 30 days notice. 3. Disputes are resolved in California courts.
1. The service is provided as-is. 2. Either party may terminate with 30 days notice. 2a. Termination notice must be in writing. 3. Disputes are resolved in California courts.
挿入された 1 行(2a 行)が唯一の差分です。前後のコンテキスト行はそのまま保たれ、契約書やポリシー文書の赤入れに最適です。
ログ調査 — リクエスト時間の変化
GET /api/users 200 14ms POST /api/orders 201 88ms GET /api/orders/42 200 21ms
GET /api/users 200 14ms POST /api/orders 201 4200ms GET /api/orders/42 500 21ms
2 行が変わります。行内ハイライトが 88ms → 4200ms のレイテンシ漂流と 200 → 500 のステータスコード変化を示します。インシデント対応の定石です。
行末空白 — 「行末を無視」を切り替え
margin: 0; padding: 0; border: none;
margin: 0; padding: 0; border: none;
オプションを使わないと、1 行目は行末スペースのせいで差分と判定されます。「行末スペース / タブを無視」を有効にすると差分はゼロに。`git diff -b` と同じ挙動です。
使い方
- 1
両方のバージョンを貼り付け
左に元のテキスト、右に変更後のテキストを貼り付けてください。入力中もライブ diff がレンダリングされ、大きな入力(合計 200 KB 超)では手動 Diff ボタンに切り替わります。
- 2
必要な無視オプションを有効化
大文字小文字、すべての空白、行末スペース、空行を無視 —— いずれも独立して動作し、訪問間で保持されます。
- 3
差分を読むかパッチを取得
並列表示は人間のレビュー用、統一表示は `---/+++/@@` パッチ形式用です。「統一 diff をコピー」で、コードレビューや `patch -p1` 用のクリーンなパッチをクリップボードに送れます。
よくある Diff の落とし穴
Windows と Unix 間でコピーしたらファイル全体が「変わった」
Unix で編集された原文に Windows の Notepad から貼り付けると、すべての行で \r の差分が出ます。「行末スペース / タブを無視」を有効にして CR 文字を黙らせましょう。
Diff: 200 件の変更(すべて行末 \r が原因)
行末スペース / タブを無視 → 実際の変更は 2 件
インデントだけの差分が騒がしい
タブ ↔ スペースの再フォーマットは行単位の差分を爆発させます。「すべての空白を無視」で本当の意味的変更だけに絞れます。
Diff: 87 件の変更(すべてインデント変更)
すべての空白を無視 → 実際の変更は 4 件
空行 1 行のせいで同じ段落が変更扱い
文章に空行を 1 行追加 / 削除するだけで、領域全体がずれることがあります。「空行を無視」なら本文に触れずに直せます。
Diff: 段落 2 が「完全に変わった」(空行が移動しただけ)
空行を無視 → 段落 2 には変更なし
diff は「同一」と言うのにファイルが違う
ほぼ常に、前のセッションの大文字小文字や空白の無視オプションが残っているケースです。「無視オプション」パネルを開けば、すべてのトグルが見えます。バイト厳密に比較したい場合はすべてオフにしてください。
差分 0 件と表示されるが、`cmp` はファイルが違うと言う
すべての無視オプションをオフ → 本当の差分が出る
貼り付けた JSON が「全部変わった」ように見える
テキスト diff はキーの順序を意味あるものとして扱いますが、JSON ではそうではありません。JSON のペイロードには専用の JSON Diff を使ってください。キー順序を無視し、型の厳密性を尊重します。
JSON にテキスト diff: 行の 100% が変更(実はキーの並び替えだけ)
<a href="/ja/tools/json-diff">JSON Diff</a>: 差分 0 件
「diff が切り詰められた」警告を無視
片側 5,000 行を超えると入力はクリップされます。警告が出たらコマンドラインの `diff -u file1 file2` や `git diff --no-index` に切り替えてください。どちらもストリーミングで GB 級を扱えます。
20,000 行のログを貼り付け —— 最初の 5,000 行しか diff されない
ターミナルで `diff -u a.log b.log` を実行してファイル全体を処理
主なユースケース
- コードレビューの断片
- 同じ関数の 2 つのバージョンを左右に貼ると、リネーム、削除された分岐、新しいガード句が一目で分かります。1 行の変更を確認するには、GitHub の diff をスクロールするより行内単語ハイライトのほうが速いです。
- 契約書 / ポリシーの赤入れ
- 昨日の契約書と今日の改訂版を貼り付け。挿入された条項が浮かび上がり、変わっていない段落はグレーに沈みます。法務レビューの証跡として統一パッチを書き出せます。
- ログのタイムライン調査
- SRE のインシデント前のログスライスと、発生中のスライスを比較。レイテンシ、ステータスコード、頻度の漂流が `awk` なしですぐに浮かび上がります。
- 原稿 / 草稿の改訂
- 草稿と編集者のバージョンを貼り付け。行内単語 diff がどの文が書き直されたかを正確に示し、修正の採用 / 却下を 1 つずつ判断するのに非常に役立ちます。
- 翻訳レビュー
- 旧訳と再翻訳を diff して、新訳が意味、構造、プレースホルダーを保っているか確認。「行末スペースを無視」をオンにすると、翻訳者がよく持ち込む末尾のノイズを抑えられます。
- 設定 / .env ファイルの監査
- 2 つの `.env`、`docker-compose.yaml`、シェル rc ファイルを比較。「空行を無視」をオンにすれば、書式の揺れではなく機能的な差分に集中できます。
技術詳細
- 前後トリム付きの LCS
- 動的計画法の LCS を実行する前に、共通の先頭・末尾の行を取り除きます。「2,000 行の設定で 1 行だけ変わった」ような diff は 1×1 の DP テーブルに収まり、1 ミリ秒未満でレンダリングされます。
- トークンレベルの行内 diff
- 隣接する削除 + 追加のハンクをペアにし、Unicode の単語 / 非単語 / 空白の連なりでトークン化します。2 回目の LCS が緑 / 赤のトークンスパンを生成し、変更行を読みやすくします。
- 統一 diff は git / patch 互換
- 出力は GNU patch 用に定義され、Git、GitHub、すべてのコードレビューツールが使う `---/+++/@@ -L,C +L,C @@` 形式に従います。`pbpaste | patch -p0` で適用できます。
- 片側 5,000 行の入力上限
- 上限を超えると diff は切り詰められ、警告が出ます。数 MB の入力にはコマンドラインの `diff -u` や `git diff --no-index` をご利用ください。ストリーミングで GB 級にも対応します。
ベストプラクティス
- 読む前に無視オプションを選ぶ
- 行末スペース、CRLF、大文字小文字のノイズは信号を埋もれさせます。先に正しいオプションを切り替えると差分が読みやすくなり、「偽の」変更を読み飛ばす癖を身につけずに済みます。
- 共有は統一 diff、レビューは並列表示
- ビジュアルな列はあなたの目のため、統一パッチは他人の端末のためです。コピーした統一 diff は、Slack のメッセージ、Jira のコメント、`patch -p1` にそのまま貼り付けられます。
- 一致率 % で健全性チェック
- 「ほぼ同じ」のはずなのに一致率が 30% なら、改行コードや空白の問題があります。「すべての空白を無視」を有効にして再確認してから差分を読みましょう。
よくある質問
貼り付けたテキストはサーバーに送信されますか?
テキスト diff と JSON diff の違いは?
空白、大文字小文字、空行を無視するには?
統一 diff(unified diff)とは? いつコピーすべき?
1 単語しか変えていないのに、行全体が変わったように表示されるのはなぜ?
CRLF と LF の改行コードはどう扱われる?
入力サイズの上限は?
コードを diff できる? 言語を認識する?
1 箇所の編集が、削除 + 追加の 2 行として表示されることがあるのはなぜ?
% 一致率はどう計算される?
diff を同僚と共有できる?
アラビア語やヘブライ語のような右から左の言語に対応している?
関連ツール
すべてのツールを見る →無料の Regex テスター — パターンをオンラインでデバッグ & マッチ
テキスト処理
任意のテキストに対して regex パターンを即座にテストできます。リアルタイムのマッチハイライト、キャプチャグループ、置換プレビュー、分割、パターン解説に対応。JavaScript 系の正規表現を 100% プライベートに、登録不要で利用できます。
無料の文字数カウンター & 単語カウントツール
テキスト処理
単語数、文字数、文の数、段落数、読了時間をリアルタイムで計測できます。Twitter、メタディスクリプション、Instagram の文字数制限チェックにも対応。無料・プライベート・登録不要。
進数変換ツール — 2進数・16進数・10進数・8進数
単位変換
無料オンライン進数変換ツール。2進数、8進数、10進数、16進数および任意の基数(2-36)間で数値を瞬時に変換。BigInt対応で桁数制限なし。登録不要・サーバー送信なし、すべての処理がブラウザ内で完結。コピーボタンやコードリテラル出力で開発作業を効率化。
Base64エンコーダー&デコーダー
エンコーディングとフォーマット
Base64のデコード・エンコードが無料でオンラインで行えます。リアルタイム変換、UTF-8・絵文字対応。100%ブラウザ上で動作しデータは外部に送信されません。登録不要。
Crontab ジェネレーター & cron 式ビルダー
日付/時刻ツール
ブラウザ上で cron 式を生成・検証・デコードできます。ローカルタイムまたは UTC での次回実行プレビュー、POSIX 5 フィールド構文、プリセット、自然言語による説明に対応。無料・プライベート・登録不要。
CSV to JSON 変換ツール
エンコーディングとフォーマット
CSVをブラウザ内で即座にJSONに変換。RFC 4180・型推論・ヘッダー行・大整数安全対応。100%プライベート、アップロード不要。