在线对比两段文本

把改前、改后两段文字分别粘进左右两栏,本页按行做最长公共子序列比对,标出哪些行被改、哪些行只在一边出现,并给出整体相似度。全程在浏览器本地完成,文本不上传服务器。

差异明细(演示值下共 4 行差异)
左行号右行号状态左侧内容右侧内容
11修改项目周报 · 第 12 周项目周报 · 第 13 周
88修改附件:report.pdf附件:report-v2.pdf
1111修改参与人数:6参与人数:7
—13仅右侧(无)下周评审:周三上午

对比口径:先按行切分,再求最长公共子序列(LCS),相同的行对齐、其余归为修改或单侧行;相似度 = 2 × 相同行数 ÷(左行数 + 右行数)。在文本区里按 Ctrl+Enter(Mac 用 Cmd+Enter)即可重新对比。

使用方法

在线对比两段文本的操作就是「两栏粘贴、勾选项、点对比」,五步搞定:

  1. 把改前的文本粘进左栏、改后的粘进右栏。本页按行切分,所以两份文本都先用换行分好段,比对才有意义。
  2. 勾选项:「忽略首尾空白」默认开着,适合缩进或行尾空格变过的情况;「忽略大小写」适合英文文案核对。
  3. 「忽略空行」可跳过空行干扰;「显示相同行」默认关闭,打开后差异表会连相同行一起列出,方便通读全文。
  4. 「最大显示差异行」填 50(10~500),差异特别多时用来截断;「相似度小数位」填 1(1~4)。
  5. 点「开始对比」,或在文本区里按 Ctrl+Enter。五张卡片给相似度、相同行、修改行、仅右侧、仅左侧;下方差异表一行一条,可复制或导出 CSV。想恢复演示文本点「载入示例」。

在线对比两段文本能解决什么

它解决「两段字到底改了哪儿」这个肉眼难查的问题,四类场景最常见:

  • 改稿核对:周报改了一版,本页直接指出第 1 行的周次、第 8 行的附件名、第 11 行的人数被改,其余 9 行没动,不用一行行扫。
  • 配置与清单比对:两份环境配置、依赖清单粘贴进来,被改的项和新增的项分色列出,漏改一眼可见。
  • 合同与条款核稿:法务返回的版本和原稿逐行对,先看修改行数量再逐个确认,比通读两遍省时间。
  • 复制粘贴校验:从 PDF 或网页复制下来的文本常丢行,和原件一比就知道哪几行丢了(会显示成「仅在左侧」)。

本页不做的事:不做字符级或词级高亮,差异最小单位是行;不做三方合并,也不生成补丁文件;不判断语义等价——把「负责人:李工」改成「负责人:李工程师」仍算一行修改,哪怕意思没变。

原理和变量

① 用了哪个具体函数:先用 split(/\r?\n/) 把两栏文本切成行数组,再跑最长公共子序列(LCS)动态规划填 dp[i][j],回溯时用 Math.max(dp[i-1][j], dp[i][j-1]) 决定走向,最后把相邻的删除块与插入块配对成「修改」。

② 关键参数为什么这样取:用行级而不是字符级,是因为行级 LCS 的结果人一眼能读,且 O(n × m) 的代价在几千行内可接受;字符级虽然更细,输出却会碎成大量高亮片段。默认「忽略首尾空白」开、「忽略大小写」关,是因为缩进与行尾空格的变动最常见且通常无意义,而大小写变化在英文里往往是有意的修改。

③ 遵循哪个约定:相似度采用 Dice 系数 2 × LCS ÷(左行数 + 右行数),取值 0~100%。这与 Git 的 diff 不一样——Git 用 Myers 算法且按字节比较,所以本页的「修改行数」和 git diff --stat 的增删行数可能不完全相等,两者不必强行对齐。

④ 输入怎么变成输出:演示值左 12 行、右 13 行,逐行比对后 LCS 长度为 9(即相同行);剩下的删除块与插入块两两配对得 3 行修改,右侧多出的最后一行无人配对,记为 1 行新增;相似度 = 2 × 9 ÷ (12 + 13) = 72.0%。

⑤ 边界与阈值:单侧最多 2000 行、200000 字符,超出会提示拆分后再比;最大显示差异行限 10~500,差异超过上限时表格截断并写出「还有 N 行未显示」;两侧文本都为空会提示至少填一侧;相似度小数位限 1~4。

⑥ 常见误用的正确解释:别把相似度当成「改动比例」——100% − 72% = 28% 只是分母意义上的差异,不等于内容改动了 28%;整段顺序调换(比如把第 2 段挪到末尾)会被 LCS 判成一大片删除加一大片新增,相似度骤降,这属于算法口径而非算错。

完整示例(数值仅作演示)

沿用默认演示文本:左栏 12 行周报(第 12 周),右栏 13 行周报(第 13 周),默认勾选「忽略首尾空白」,其余选项关闭。

  • 切分结果:左侧 12 行、右侧 13 行,合计 25 行进入比对。
  • 相同行:9 行(负责人、本周完成两行、下周计划、风险、备注、状态、更新时间、结论)。
  • 修改行:3 行——第 1 行周次 12→13、第 8 行附件 report.pdf→report-v2.pdf、第 11 行人数 6→7。
  • 仅右侧:1 行——右栏末尾新增的「下周评审:周三上午」。
  • 仅左侧:0 行,说明这一版没有删掉任何原有内容。
  • 相似度:2 × 9 ÷ (12 + 13) = 0.72,保留 1 位小数显示 72.0%。
  • 把「显示相同行」勾上后,差异表会从 4 行变成 13 行(4 条差异加 9 条相同)。

这七组数字与页面默认卡片、差异表完全一致,可三处核对。

输入范围与对照表

在线对比两段文本的对照表列出全部开关、取值范围与演示取值,末四行是超限时的具体行为:

输入项、取值范围与演示取值(后 4 行为边界行为说明)
输入项取值范围演示取值对应结果或说明
左侧文本字符数0~200000202超出时提示拆分后分段比对
右侧文本字符数0~200000231超出时提示拆分后分段比对
左侧行数0~200012行数即 LCS 表的第一维
右侧行数0~200013行数即 LCS 表的第二维
忽略大小写开 / 关关开启后 Report 与 report 视为相同
忽略首尾空白开 / 关开开启后缩进变化不算差异
忽略空行开 / 关关开启后空行不进入比对
显示相同行开 / 关关开启后差异表连相同行一起列
最大显示差异行10~50050差异更多时截断并注明剩余行数
相似度小数位1~41决定显示 72.0% 还是 72.00%
相似度0~100%72.0%2 × 相同行数 ÷ 两侧行数之和
修改行计数0~两侧较小行数3删除块与插入块的配对数

相似度的读法:100% 是完全一致,90% 以上通常只是少量改动,60%~90% 属于结构性改动,低于 60% 基本等于重写或换稿。

结果边界和舍入

舍入位置:相似度按「相似度小数位」用 toFixed 保留(默认 1 位,演示值 72.0%);相同行、修改行、单侧行都是整数计数,不存在舍入问题。

什么时候会拒绝对比:两侧文本都为空时提示至少填一侧;单侧超过 2000 行或 200000 字符时提示拆分后分批比对;「最大显示差异行」不在 10~500、「相似度小数位」不在 1~4 时,错误区会写出字段名与允许区间并停止本次对比,不会把结果悄悄算成 0。

截断提示:差异行超过「最大显示差异行」时,表格只显示前若干行,并在提示区写明「还有 N 行差异未显示」。想看全量就把上限调到 500,或勾上「忽略空行」先滤掉噪声。

结果性质:这是行级文本差异,不是语义判断。措辞改写、同义替换、段落搬家都会被记为差异;需要判断意思是否变化,仍要人工过一遍。

常见问题

相似度是怎么算出来的?

用 Dice 系数:2 × 相同行数 ÷(左行数 + 右行数)。演示值左 12 行、右 13 行、相同 9 行,即 2 × 9 ÷ 25 = 72.0%。它衡量的是两侧重合程度,不是「改了多少内容」。

为什么和 git diff 的行数对不上?

算法不同:Git 用 Myers 算法按字节求最短编辑脚本,本页用最长公共子序列按行对齐,空行与空白的处理规则也不一样。两者都属于合理解,不必强行对齐数值。

能做字符级高亮吗?

不能。本页差异的最小单位是行,修改行只给出左右两行的原文,不做行内逐字标红。需要行内高亮请把改动行复制到编辑器里再用其它工具细看。

把段落顺序换一下,相似度怎么暴跌?

这是 LCS 的正常表现:顺序调换后原行无法按顺序对齐,会被判成一大片删除加一大片新增。若只是位置调整,勾上「显示相同行」看哪些行其实还在,只是序号变了。

中英文混排会影响比对吗?

不会。比对按 Unicode 行文本逐行相等判断,中英文一样处理;「忽略大小写」对中文无效(中文没有大小写),只对英文大小写起作用。

超过 2000 行怎么办?

本页会拒绝并提示拆分。建议按章节或按段落切成若干段,分段比对后再把差异手工汇总,避免一次比对过大文本拖慢浏览器。

「忽略首尾空白」什么时候该关掉?

比代码或 YAML 这类缩进有含义的文本时要关掉,否则缩进层级变化会被当成无差异;比普通中文稿件、会议纪要时保持开启更省事。

我的文本会被上传吗?

不会。切分、比对、相似度计算全在浏览器里完成,刷新即清空;可在浏览器 Network 面板复查,点「开始对比」时没有任何请求发出。

相关工具