使用方法
在线对比两段文本的操作就是「两栏粘贴、勾选项、点对比」,五步搞定:
- 把改前的文本粘进左栏、改后的粘进右栏。本页按行切分,所以两份文本都先用换行分好段,比对才有意义。
- 勾选项:「忽略首尾空白」默认开着,适合缩进或行尾空格变过的情况;「忽略大小写」适合英文文案核对。
- 「忽略空行」可跳过空行干扰;「显示相同行」默认关闭,打开后差异表会连相同行一起列出,方便通读全文。
- 「最大显示差异行」填 50(10~500),差异特别多时用来截断;「相似度小数位」填 1(1~4)。
- 点「开始对比」,或在文本区里按 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 条相同)。
这七组数字与页面默认卡片、差异表完全一致,可三处核对。
输入范围与对照表
在线对比两段文本的对照表列出全部开关、取值范围与演示取值,末四行是超限时的具体行为:
| 输入项 | 取值范围 | 演示取值 | 对应结果或说明 |
|---|---|---|---|
| 左侧文本字符数 | 0~200000 | 202 | 超出时提示拆分后分段比对 |
| 右侧文本字符数 | 0~200000 | 231 | 超出时提示拆分后分段比对 |
| 左侧行数 | 0~2000 | 12 | 行数即 LCS 表的第一维 |
| 右侧行数 | 0~2000 | 13 | 行数即 LCS 表的第二维 |
| 忽略大小写 | 开 / 关 | 关 | 开启后 Report 与 report 视为相同 |
| 忽略首尾空白 | 开 / 关 | 开 | 开启后缩进变化不算差异 |
| 忽略空行 | 开 / 关 | 关 | 开启后空行不进入比对 |
| 显示相同行 | 开 / 关 | 关 | 开启后差异表连相同行一起列 |
| 最大显示差异行 | 10~500 | 50 | 差异更多时截断并注明剩余行数 |
| 相似度小数位 | 1~4 | 1 | 决定显示 72.0% 还是 72.00% |
| 相似度 | 0~100% | 72.0% | 2 × 相同行数 ÷ 两侧行数之和 |
| 修改行计数 | 0~两侧较小行数 | 3 | 删除块与插入块的配对数 |
| 单侧超 2000 行 | 拒绝 | — | 提示按段落拆分后分批比对 |
| 两侧都为空 | 拒绝 | — | 提示至少在一侧填入文本 |
| 换行符 | LF 与 CRLF | 自动归一 | 两种换行都按同一规则切分 |
| 对比粒度 | 行级 | 行级 | 不做字符级高亮与三方合并 |
相似度的读法: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 面板复查,点「开始对比」时没有任何请求发出。
相关工具
- SQLJoinsVisual速查表:核对 SQL 改写前后的连接语义差异。
- 比特转数字转换器:比对二进制串前先转成可读数字。
- JSON转环境变量转换器:两份配置对比前统一成同一格式。
- MAC地址查询:核对设备清单里的地址是否改错。
- URL转Markdown链接:改稿后批量把链接转成 Markdown。
- YAML校验:先确认两份配置都能解析,再做行级比对。
- CSV转Markdown表格:把差异结果整理成表格贴进文档。