Command Palette

Search for a command to run...

テキスト差分チェッカー: 目に見えない変化を目にするのをやめる

テキスト差分チェッカー: 目に見えない変化を目にするのをやめる

T
Toolz Team
|Jul 5, 2026|14 分読んでください

テキストツール コレクションの一部

テキスト差分チェッカー

2 つのテキストを比較して、違いを見つけます。 追加、削除、および共通部分を単語または文字レベルの比較でハイライトします。

テキスト差分チェッカーを使う

WP Adminifyの顧客は、かつて私に彼のプラグイン設定の2 つのエクスポートを送った - " アップデートの前に、すべてが働いた; 後、管理メニューが壊れている 何も他の変更. " 2 つのJSONブロブ、それぞれ約340 行を並べて読み、2 回、そして自信を持って彼に同意した: 同一何も変更されていない私たちのバグである必要があります。

違いました。 ようやく自分の目を信頼するのをやめて 2 つのファイルを区別したとき、217 行目: メニューのロール キーが表示されました。 "administrator" にする "administrator "ー後続のスペースを持つ。 1 つの目に見えない文字。 私は個人的にそれを2 回読んだことがあった、なぜなら人間の目はdon& #39; tは文字列を比較する; 彼らはパターンマッチ形状、および administrator あんど administrator 同じ形をしています。

そのサポート チケットは私のルールを永久に変更しました。 2 つのテキストが約 10 行よりも長い場合、読んでも比較しません。 今まで。 Diff アルゴリズムには、だますためのパターンマッチングのショートカットがありません - それはすべての文字を比較し、何が違うのかを正確に報告します。 the テキスト差分ツール Toolz.dev では、お客様のブラウザでこれを行います。つまり、顧客の構成、契約、および未発表のコードは決してマシンから離れません。 実際にどのように違いが機能し、どのようにうまく使えるかを次に示します。

tl;dr: 数行より長いテキストを視覚的に比較することは決してありません - 目は後続のスペース、交換された数字、および単一単語の編集を見逃します。 に両方のバージョンを貼り付けます テキスト差分ツール: 緑 = 追加、赤 = 削除、同じマイヤーズ アルゴリズム ファミリによって計算されます。 git diff。 使い ラインモード コードと構成については、 ワードモード プロスと契約のため。 構造化データの場合、 json 差分 テキストではなく意味で比較します。 すべてがクライアント側で実行されます。


差分アルゴリズムは実際にどのように機能しますか?

核となるアイデア: を見つける 最も長い共通のサブシーケンス 2 つのテキストの (LCS) - 両方に現れる行 (または単語、または文字) の最長のシーケンスが同じ順序で。 LCS 内のすべては " 変更なし." バージョン A に残っているものは何でも ' バージョン B に残っているものは追加です。 A "変更済み "行は単なる削除であり、たまたま隣り合って座っている追加です。

これを効率的に計算する標準的な方法は、Eugene Myers' 1986 年の論文から得られた論文から得られたものです。 「O(nd) 差異アルゴリズムとそのバリエーション」。 エレガントな部分は、複雑さの境界が言うことです。 n 入力サイズですが、 d差数. 2 つのほぼ同一のテキストは、どれだけ長くてもほぼ瞬時に異なります。なぜなら、アルゴリズム & #39;s の動作は、どれだけ大きくても、どれだけ異なるかに応じてスケールされるからです。それ & #39;s 1 行異なる 2 つの 300 行構成を 1 行ずつ区別すると、瞬時に感じるのはなぜですか。アルゴリズムはほとんど何も行わず、まさにこれが、あなたの目が最も多くの作業を行って失敗している状況です。

この同じアルゴリズム ファミリがデフォルトのエンジンです。 git diff、GNU diff、そしてこれまでに使用したほとんどの比較ツール。 (Git も提供しています patience あんど histogram 同じ変更をより人間が読めるグループ化する場合があるバリアント - セット 変更の変更は同じで、プレゼンテーションが異なります。)

重要でない重要なプロパティの 1 つ: 差分が常に一意であるとは限りません。 既存の 2 つの空白行の間に空白行を追加すると、新しい空白行はまったくあいまいであり、さまざまなツールが異なるものを強調表示する場合があります。 どちらの答えも正しいです。

行、単語、または文字の差 - どのモードがいつですか?

で比較する粒度によって、出力の良さが変わります。 これを誤解することが、人々が差分出力を「うるさい」と感じる主な理由です。

ラインレベル ワードレベル 文字レベル
比較する 線全体を原子として 個々の言葉 個々の文字
1 語の編集は次のように表示されます。 行全体が削除され、再追加されました ただその言葉 変更された文字だけ
に最適 コード、構成、CSV 行 散文、契約書、ドキュメント タイプミス、ハッシュ、エンコードされた文字列
弱点 長い段落の編集: あなたはまだ線の中で狩りをしています リフロー/リラップされたテキスト全体でうるさい 大規模な編集では読めません
クラシック ユーザー git diff 法定ブラックライン / 編集レビュー 「これら 2 つの API キーは同じように見えます」

具体例。 オリジナル: The quick brown fox jumps over the lazy dog. 変更: The quick red fox leaps over the lazy cat.

  • ラインモード 文全体が変更されたようにフラグを立てます - 正確で役に立たない.
  • ワードモード 正確にハイライト brown→redjumps→leapsdog→cat
  • キャラクタモード ここではやり過ぎですが、それがキャッチできる唯一のモードです admlnistrator vs administrator

経験則: 構造化テキスト (1 行につき 1 つの意味のあるステートメント) が行モード、流れるテキストが単語モード、文字モードは、他の 2 つが「変更」と言うときに引き出した虫眼鏡です。その理由はわかりません。 私の末尾のスペースのバグは、正規の文字モードの場合です。

スタンドアロンの差分ツールが Git より優れているのはいつですか?

git'のデフは素晴らしい 同じリポジトリにあるものの場合。 驚くべき量の比較作業は、次のように述べています。

サポートチケット。 私のイントロからのシナリオ - 顧客からの2 つの設定のエクスポート They& #39; re not in any repo. paste both into the テキスト差分ツール 回答は、2 回の失敗ではなく、数秒で表示されます。

構成ドリフト。 ステージング NGINX 構成と本番環境の NGINX 構成。 流れ .env 物事が壊れる前からのバックアップ。 git diff 2 つの異なるサーバー上でファイルを表示できません。コピーして貼り付けることができます。

フォーマッタ検証。 ファイル全体でよりきれいな (または PHPC または黒) を実行し、それが変更されたという信頼性が必要です フォーマットのみ。 前後の差分: 空白、引用符、およびセミコロン以外の何かが表示された場合、フォーマッタはロジックに触れ、今知りたいと思います。

2 つの API 応答。 ステージングは 1 つの JSON ボディを返し、プロダクションは別のボディを返し、フロントエンドはステージングでのみブレークします。 応答を異なります。 (特に JSON の場合は、 json 差分ー解析された構造を比較するので、キーの順序と空白 don' t は偽陽性を作成します。 を介して両方のペイロードを実行します JSON フォーマッタ 代わりに、読みやすいテキストの差分が必要な場合は、最初に。)

書類と契約書。 ベンダーは" を返しますマイナーアップデートで同じ契約." ワードモード差分は、あなたが支払い条件がネット30 からネット15 に40 ページの文書で行ったことを発見する方法です編集者や弁護士は永遠にこれを知っています - 彼らはそれをブラックラインまたはレッドラインと呼びます。

翻訳ファイルとローカライズ ファイル。 2 つのバージョンの比較 .po ファイルを作成して、実際にどの文字列が変更されたかを確認してから、翻訳者に送信します。これは、400 個の変更されていない文字列を再翻訳するための料金を節約する、実際の WP Adminify ワークフローです。

共通スレッド: 両方のバージョンが選択できるテキストとして存在する瞬間、差分ツールが " に答えます。何が変更されましたか?" 機械的に。そして、Toolz.dev ツールはクライアント側であるため、customer's config または署名されていないコントラクト does't をどこにでも送信します。残りの部分と同じ引数です プライバシー優先ツールボックス

自分をだまさずに差分出力を読み取るにはどうすればよいですか?

色の規則は、次の世界に共通しています。 赤は古いバージョンの専用コンテンツ (削除)、緑は新しいバージョン (追加)、変更されていないテキストは、コンテキストに対してプレーンになります。 変更された線は、赤い線の後に緑の置換が続きます。

差分レビューを実際に信頼できるものにする 3 つの習慣:

バージョンを適切なスロットに配置します。 左側 (または最初のフィールド) に古い/オリジナル、右側に新しい/変更。それらを交換し、すべての追加は削除として読み取られます - I' このために人々が 10 分間間違った方向をデバッグするのを見ました。出力が逆方向に見える場合は、おそらくそうでしょう。

始める前に、どんなノイズかを決めてください。 再フォーマットされたコードの比較?空白の変更はノイズです - 正規化するか無視します.YAMLコンフィグの比較?空白は 意味- インデントは YAML の構造であるため、両側を検証します YAML バリデータ すべての空間を信号として扱います。 同じツールを使用し、ポリシーと反対で、間違った選択をすると、ノイズが実際に変化するか、または非表示になります。

最初のハンクだけでなく、すべてのハンクを読んでください。 The customer's trailing space was change #1 of 1.しかし、diffが4つの変化を示し、最初の変化があなたの症状を説明するとき、読むのをやめたいという誘惑は強い - そして、変更 #3 は時々来週あなたを噛むものです。 diffはすでに難しい部分を行いました; don'tは最後のステップで人間のサンプリング誤差を再導入します。

テキストの違いでは何を教えてくれませんか?

限界について正直であることは価値があります。

  • 移動したブロックは、削除 + 追加として読み取られます。 ファイルの先頭から関数を切り取り、下に貼り付けます。差分は、削除して追加したもので、移動せずに、削除します。 一部の特殊なツールは動きを検出しますが、プレーン LCS は動作しません。
  • 意味ではなく、テキストを比較します。 0.1 + 0.2 あんど 0.3 異なると異なる(それらは)異なると異なるが、また、異なる 振る舞う 浮動小数点数では異なりますが、逆に、 "key": 1 vs "key": 1.0 テキストは異なる場合がありますが、あなたの言語では意味的に同じです。 構造化された比較 ( json 差分) は、データ形式のこのギャップの一部を閉じます。
  • バイナリ コンテンツは範囲外です。 画像、バイトとしてのPDF、実行可能ファイル - text diffにはテキストが必要です 最初にテキストを抽出するか、フォーマット固有のツールを使用します。
  • ケースとエンコードは文字通り比較されます。 READMEreadme、UTF-8 カーリーの引用 ≠ ほとんどのフォントで同じように見えますが、ASCII ストレートの引用です。 (もう 1 つの形状パターン トラップ、アルゴリズムのもう 1 つの勝利)。 で事前正規化 ケースコンバーター ケースが比較にならない場合は、問題がありません。

よくある質問

ファイルを比較したり、テキストのみを貼り付けたりすることはできますか?

ザ・ テキスト差分ツール 貼り付けられたテキストで動作します。各ファイルを任意のエディタで開き、両面をコピーして貼り付けます。これにより、形式に依存しなくなります。's の読み取り可能なテキスト (コード、構成、CSV、SQL、散文) は、拡張子に関係なく比較できます。

比較するためのサイズ制限はありますか?

処理はブラウザー内であるため、実際の制限はデバイスのメモリです。 数千行のファイルは即座に比較され、マイヤーズのアルゴリズムのコスト スケールは、数に応じてスケールされます。 違いということで、大きいが類似のテキストでも高速に保たれます。 大きな違いのある数十万行には、数秒かかる場合があります。

コードにどのデフモードを使用すればよいですか?

ラインモード. codeは当然1 行につき1 つのステートメントであるので、ラインレベルの出力は変更についての考え方にきれいにマッピングされる. wordまたはcharacterモードに切り替わるのは、行が変更されたフラグを立てられ、その中の違いを見つけることができるときだけである' t - that' s通常、空白、引用符、または単一の文字。

契約と散文に最適なモードはどれですか?

単語モード。散文の変更は通常、長い段落の内側に単語の置換と挿入された節です。行モードでは段落全体にフラグが立てられ、検索が残ります。単語レベルの強調表示は、どの単語が変更されたかを正確に示します。これは、法的なブラックラインと同じアプローチです。

差分は私のテキストを変更または保存しますか?

いやー ハイライト表示はレンダリングされた出力にのみ存在します。入力テキストは変更されず、ツールは完全にクライアント側で実行されるため、どちらのバージョンも送信も保存されません。 タブを閉じると、テキストがなくなります。

差分が同じように見える線を強調表示するのはなぜですか?

ほとんどの場合、目に見えない文字: 後続スペース、タブとスペース、ウィンドウ \r\n 対 UNIX \n 行末、区切りのないスペース、または Unicode の類似物 (カール引用符とストレート引用符)。これはまさに人間の目には見えず、差分アルゴリズムが常にキャッチする変化のクラスです。私の後続スペースのサポート チケットもその 1 つでした。

移動したテキストを検出できますか?

移動としてではない。 standard LCS-based diffing reports a moved block as deleted from the old location and added at the new one.移動が疑われる場合は、" added" テキストを元のテキストで検索します - ファイルの他の場所での正確なヒットにより、それが確認されます。

JSON diff は、テキストの差分とどう違うのですか?

文字差は文字を比較します。 json 差分 ドキュメントと比較構造の両方を解析します。 キーの並べ替え、インデントの変更、および末尾のカンマでは、構造上の違いがゼロになるため、実際の値とキーの変更のみが表示されます。 両面が有効な JSON の場合はいつでも使用してください。そうでない場合は、テキストの差分にフォールバックします。

テキストを比較するときに空白や大文字と小文字を区別するにはどうすればよいですか?

白空間がノイズかシグナルかをまず決定します: 再フォーマットされたコードではノイズですが、YAML または Python インデントでは構造です。ノイズである場合は、差分を付ける前に両側を正規化します - 繰り返しスペースを折りたたみ、末尾の空白をストリップし、行末を一貫性のあるものにします - したがって、実際の変更のみが残ります。 diff はデフォルトで README と readme を異なるものとして扱うため、比較する前に大文字と小文字の両方を無視します。

Git Diff ではどのアルゴリズムを使用しますか?

デフォルトでは git diff はマイヤーズアルゴリズムの変種を使います、これはほとんどの diff ツールが共有している Eugene Myers' 1986 年の論文と同じ longest-common-subsequence approach です。 git は patience や histogram の変種も提供していて、変更をより読みやすくグループ化できますが、同じ差分セットを報告します - プレゼンテーションの変更のみです。 このツールは同じマイヤーズアルゴリズムファミリーを使います。

Frequently Asked Questions

The Text Diff tool works on pasted text: open each file in any editor, copy, paste both sides. That makes it format-agnostic — anything that's readable text (code, config, CSV, SQL, prose) can be compared, regardless of extension.

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!