文本对比工具完全指南:原理、算法与工具推荐

详细介绍文本对比的原理、常用算法和在线工具。学习如何高效地比较文本差异。

文本处理 2026-06-05 8 分钟

文本对比工具完全指南:原理、算法与工具推荐

文本对比是开发和写作中的常见需求。本文介绍文本对比的原理、算法和工具。

文本对比的应用场景

  1. 代码审查:比较代码修改前后的差异
  2. 文档校对:检查文档的修改内容
  3. 数据验证:比较数据文件的变化
  4. 版本控制:Git diff 显示代码变更

常用 Diff 算法

1. LCS(最长公共子序列)

找到两个序列的最长公共子序列,然后标记差异。

文本A: ABCD
文本B: AECF

LCS: AC
差异: B→E, D→F

2. Myers Diff 算法

Git 使用的 diff 算法,效率高。

# Git diff
git diff file1.txt file2.txt

3. 简单行对比

逐行比较,适合简单场景。

function lineDiff(text1, text2) {
  const lines1 = text1.split('\n');
  const lines2 = text2.split('\n');
  const result = [];
  
  const maxLen = Math.max(lines1.length, lines2.length);
  for (let i = 0; i < maxLen; i++) {
    if (lines1[i] !== lines2[i]) {
      result.push({ line: i + 1, old: lines1[i], new: lines2[i] });
    }
  }
  return result;
}

JavaScript Diff 库

diff

const Diff = require('diff');

// 行对比
const changes = Diff.diffLines(text1, text2);
changes.forEach(change => {
  if (change.added) {
    console.log('+', change.value);
  } else if (change.removed) {
    console.log('-', change.value);
  } else {
    console.log(' ', change.value);
  }
});

// 字符对比
const charDiff = Diff.diffChars(text1, text2);

jsdiff

import { diffChars, diffWords, diffLines } from 'diff';

// 字符级对比
const charResult = diffChars('Hello', 'Hallo');

// 单词级对比
const wordResult = diffWords('Hello World', 'Hello JavaScript');

// 行级对比
const lineResult = diffLines('line1\nline2', 'line1\nline3');

Java Diff 库

java-diff-utils

import com.github.difflib.DiffUtils;
import com.github.difflib.patch.*;

List<String> original = Arrays.asList("line1", "line2", "line3");
List<String> revised = Arrays.asList("line1", "line3", "line4");

Patch<String> patch = DiffUtils.diff(original, revised);

for (AbstractDelta<String> delta : patch.getDeltas()) {
    System.out.println(delta.getType() + ": " + delta);
}

在线工具

jsjson.com 文本对比工具

  • 支持行级对比
  • 高亮显示差异
  • 统计变更数量
  • 本地处理,数据安全

Diff 输出格式

Unified Format

--- original
+++ revised
@@ -1,3 +1,3 @@
 line1
-line2
+line3
 line3

Context Format

*** original
--- revised
***************
*** 1,3 ****
  line1
! line2
  line3
--- 1,3 ----
  line1
! line3
  line3

最佳实践

  1. 选择合适的粒度:字符级、单词级、行级
  2. 忽略空白:有时需要忽略空格差异
  3. 上下文显示:只显示差异周围的几行
  4. 高亮显示:用颜色区分新增、删除、修改

总结

文本对比是开发和写作的基础工具。选择合适的算法和工具,可以高效地比较和分析文本差异。

📚 相关文章