文本处理 本地计算 开箱即用 内置示例 不留痕迹

文本对比工具

把两段文本分别粘贴到左右两侧,得到逐行差异(未变 / 新增 / 删除)、新增与删除行数以及两段文本的相似度;可选择严格比较、忽略大小写、忽略空白差异或两者都忽略。

核对两版文案、两段配置或两次接口返回的差异时,逐行对比比肉眼扫要可靠。这个工具输出逐行差异(未变 / 新增 / 删除)、增删行数与相似度,并提供忽略大小写、忽略空白差异的选项 —— 用来回答「是不是只改了一处」这类问题。

需要理解算法口径:逐行对比基于最长公共子序列,所以改动一行会显示成「删除旧行 + 新增新行」两条记录,而不是「修改」一条 —— 这是行级对比的通用表现,不是工具出错。忽略空白差异适合检查代码缩进调整是否夹带了内容改动;如果缩进本身有语义(如 Python、YAML),请用严格比较。

使用步骤

  1. 左右两侧分别粘贴原文与新版本。
  2. 选择比较方式:严格比较、忽略大小写、忽略空白差异,或两者都忽略。
  3. 看差异列表与相似度:确认改动符合预期,没有意外被改动的行。
  4. 行数多时先按相似度判断改动规模,再逐条核对新增与删除。

计算原理与示例

差异是怎么算出来的

先把两段文本按行切开,再用最长公共子序列(LCS)求「最少要删哪些行、加哪些行」才能从左文本变到右文本。因此改动一行会表现为「删除旧行 + 新增新行」两条记录,而不是一条「修改」——这是所有行级 diff 的通用表示法(git diff 也是这样)。

相似度的口径

相似度 = 未变行数 × 2 ÷(左行数 + 右行数)× 100%。这个口径(等价于 1 − 差异行占比)在两段长度不同时仍然稳定:例如左 3 行、右 4 行、未变 2 行,相似度为 2×2 ÷ 7 = 57.14%。完全相同自然得 100%。

为什么建议拆小文本

LCS 需要一张「左行数 × 右行数」的矩阵,计算量随文本长度平方增长。所以本工具限制单侧 3000 行、矩阵单元不超过 250 万——超出会给出明确提示而不是让页面卡住。要比较几千行以上的文件,建议先按模块拆成多段分别对比。

代码示例

Shell 命令行 diff 的三种常用写法

# 标准逐行差异(-u 输出统一格式,便于阅读)
diff -u old.txt new.txt

# 忽略大小写与空白差异
diff -u -i -w old.txt new.txt

# 只统计增删行数(批量核对时用)
diff -u old.txt new.txt | grep -c '^+[^+]'
diff -u old.txt new.txt | grep -c '^-[^-]'

# 需要「词级」对比时用 git diff --word-diff,行级对比会把整行判为改动

JavaScript 前端做快速行级对比

// 简化思路:先抵掉公共前缀与后缀,中间部分即改动区(够快也够用)
const diffStat = (a, b) => {
  const L = a.split('\n'), R = b.split('\n');
  let i = 0;
  while (i < L.length && i < R.length && L[i] === R[i]) i++;
  let j = 0;
  while (j < L.length - i && j < R.length - i &&
         L[L.length - 1 - j] === R[R.length - 1 - j]) j++;
  return { same: i + j, added: R.length - i - j, removed: L.length - i - j };
};

diffStat('a\nb\nc', 'a\nB\nc'); // { same: 2, added: 1, removed: 1 }

常见问题

相似度是怎么算出来的?

相似度 = 相同行数 × 2 ÷(左边行数 + 右边行数)× 100%。它本质上是「1 减去差异行占比」,对两段长度不同的情况也成立。完全一致是 100%,两段毫无交集是 0%。

为什么改一行会显示成「删除 + 新增」两条?

因为行级 diff 的最小单位是整行:它不会判断「这一行被编辑了」,只会判断「这一行在或不在」。所以改动一行表现为删除旧行、新增新行两条记录——git diff 和大多数代码对比工具都是这个表示法。

忽略空白差异会不会漏掉真正的改动?

有可能。忽略空白只影响「比较键」,行内的空格与制表符差异会被视为相同,但输出仍显示原文。如果缩进、对齐本身是改动内容(比如 Python 代码缩进、Markdown 列表缩进),就应该用「严格比较」而不是忽略空白。

可以比较多少个字?

单侧上限 3000 行;两段行数的乘积不超过 250 万(例如左右各 1500 行可以,各 2000 行会超限)。超限时页面会提示拆分,而不是静默算出一个不完整的结果。

能直接比较两个文件吗?

当前版本是粘贴文本比较,没有文件上传入口——这是刻意的:纯本地粘贴不涉及任何上传,也避免了大文件把浏览器卡住。需要比较文件时,用编辑器打开后复制粘贴即可。

中文和 emoji 会被算错吗?

行级比较不受影响。字符级比较(同一条改动里的细节)按 Unicode 码点切分,不会把 emoji 的代理对拆成两半,所以 😀 会被当作一个字符,不会出现「半个字符」的乱码。

粘贴的文本会被上传吗?

不会。对比算法完全在浏览器里运行,没有任何网络请求,服务端拿不到你粘贴的内容;本工具也不写计算历史,关闭页面即消失。敏感文本可以放心粘贴。

延伸阅读

来自本站原创文章,讲清这个工具背后的算法与口径。