文本对比工具完全指南:原理、算法与工具推荐
文本对比是开发和写作中的常见需求。本文介绍文本对比的原理、算法和工具。
文本对比的应用场景
- 代码审查:比较代码修改前后的差异
- 文档校对:检查文档的修改内容
- 数据验证:比较数据文件的变化
- 版本控制: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
最佳实践
- 选择合适的粒度:字符级、单词级、行级
- 忽略空白:有时需要忽略空格差异
- 上下文显示:只显示差异周围的几行
- 高亮显示:用颜色区分新增、删除、修改
总结
文本对比是开发和写作的基础工具。选择合适的算法和工具,可以高效地比较和分析文本差异。