text / compare

テキスト差分ツール

2つのテキストを行単位で比較し、追加・削除・変更箇所をハイライト表示します。 LCS(最長共通部分列)アルゴリズムで実装。入力データはサーバーに送信されません。

2つのテキストエリアに比較したいテキストを入力し、「差分を計算」ボタンを押してください

使い方

01
  1. 左側(旧テキスト)に変更前のテキストを入力します
  2. 右側(新テキスト)に変更後のテキストを入力します
  3. 「差分を計算」ボタンを押すと、2つのテキストの差分が表示されます
  4. 緑色の行(+)が追加行、赤色の行(-)が削除行です
  5. 左側の数字が旧テキストの行番号、右側の数字が新テキストの行番号です

実装コード

02

コアロジックはLCS(Longest Common Subsequence)アルゴリズムをJavaScriptのみで実装しています。 DPテーブルを構築後、バックトラックで差分を復元します。外部ライブラリは不要なので、そのままコピーしてご利用いただけます。

export type DiffKind = 'equal' | 'added' | 'removed'
export interface DiffLine {
  kind: DiffKind
  lineOld: number | null  // 元テキストでの行番号(1始まり)
  lineNew: number | null  // 新テキストでの行番号(1始まり)
  content: string
}

/** LCS(最長共通部分列)アルゴリズムを使った行単位の差分計算 */
export function diffLines(oldText: string, newText: string): DiffLine[] {
  if (oldText === '' && newText === '') return []

  const oldLines = oldText === '' ? [] : oldText.split('\n')
  const newLines = newText === '' ? [] : newText.split('\n')
  const m = oldLines.length
  const n = newLines.length

  // DPテーブルを構築(O(m*n) 時間・空間計算量)
  const dp: number[][] = Array.from({ length: m + 1 }, () =>
    new Array(n + 1).fill(0)
  )
  for (let i = 1; i <= m; i++) {
    for (let j = 1; j <= n; j++) {
      if (oldLines[i - 1] === newLines[j - 1]) {
        dp[i][j] = dp[i - 1][j - 1] + 1
      } else {
        dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1])
      }
    }
  }

  // バックトラックで差分を生成
  const result: DiffLine[] = []
  let i = m
  let j = n
  while (i > 0 || j > 0) {
    if (i > 0 && j > 0 && oldLines[i - 1] === newLines[j - 1]) {
      result.push({ kind: 'equal', lineOld: i, lineNew: j, content: oldLines[i - 1] })
      i--; j--
    } else if (j > 0 && (i === 0 || dp[i][j - 1] >= dp[i - 1][j])) {
      result.push({ kind: 'added', lineOld: null, lineNew: j, content: newLines[j - 1] })
      j--
    } else {
      result.push({ kind: 'removed', lineOld: i, lineNew: null, content: oldLines[i - 1] })
      i--
    }
  }
  return result.reverse()
}

よくある使用例・注意点

03
コードのレビューに使う
プルリクエストのレビュー前に、変更前後のコードをここに貼り付けて差分を確認できます。ファイル全体をコピーして比較することで、細かい変更点を見逃しにくくなります。
設定ファイルの比較
サーバーやアプリの設定ファイルを比較するのに便利です。本番環境と開発環境の設定差異を素早く把握できます。
LCSアルゴリズムの特性
このツールはLCS(最長共通部分列)アルゴリズムを使っています。行が完全に一致するかどうかで equal / added / removed を判定します。行内の細かい文字差分(インライン差分)は表示されません。空白の違いも1行の変更として扱われます。
大きなテキストの注意点
LCSアルゴリズムは O(m×n) の時間・空間計算量があります。行数が数千行を超える大きなファイルを比較すると、ブラウザのメモリ消費が増加する場合があります。数百行以内の比較を推奨します。
プライバシーについて
入力したテキストはブラウザ内のみで処理されます。サーバーには一切送信されないため、機密情報を含むコードや設定ファイルも安全に比較できます。

関連ツール

04
文字数カウンター正規表現テスターJSONフォーマッターテキスト → テーブル変換 — 準備中

ソースコード

05

このツールのソースコード(テストコードを含む)はGitHubで公開しています。 MITライセンスで自由に利用・改変できます。

GitHub でコードを見る →