text / compare
テキスト差分ツール
2つのテキストを行単位で比較し、追加・削除・変更箇所をハイライト表示します。 LCS(最長共通部分列)アルゴリズムで実装。入力データはサーバーに送信されません。
2つのテキストエリアに比較したいテキストを入力し、「差分を計算」ボタンを押してください
使い方
01- 左側(旧テキスト)に変更前のテキストを入力します
- 右側(新テキスト)に変更後のテキストを入力します
- 「差分を計算」ボタンを押すと、2つのテキストの差分が表示されます
- 緑色の行(
+)が追加行、赤色の行(-)が削除行です - 左側の数字が旧テキストの行番号、右側の数字が新テキストの行番号です
実装コード
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ソースコード
05このツールのソースコード(テストコードを含む)はGitHubで公開しています。 MITライセンスで自由に利用・改変できます。
GitHub でコードを見る →