文本对比

把改动前后的两段文本按行做 LCS 对比:绿色是新增、红色是删除,灰色 ~ 前缀标出被修改的行。

输入(旧文本在第一段,新文本在第二段,中间用一行 --- 分隔)
输出

      

怎么用

在输入框里粘贴两段文本,中间单独占一行写三个减号 --- 当分隔线,前半段当作旧版本、后半段当作新版本。输出里每一行都带行号:+ 开头是新增,- 开头是删除,~ 开头是修改;a 列是旧文本的行号,b 列是新文本的行号,空白表示这一行在那一侧不存在。分隔线也可以写成 ==== 或 >>>>,效果一样。

两个选项会影响结果:忽略首尾空白把每行两端的空格和 Tab 去掉再比,适合处理「编辑器自动去掉了行尾空格」,但行内部的空格仍然算差异;忽略大小写把两边都转成小写再比,适合配置项和标识符,代价是会掩盖 Name 和 name 这种真正的拼写变化。

为什么长文本会慢:LCS 的 O(n×m)

逐行对比的标准做法是先求两个行序列的最长公共子序列(LCS),再据此反推哪些行是新增、哪些是删除。求 LCS 的动态规划要填一张 行数 × 行数 的表:两边各 1000 行就是 100 万次单元格计算,各 5000 行就是 2500 万次,浏览器主线程会被占满,页面像卡死一样。

所以这里有规模保护:两边行数之和超过 3000 行,或行数乘积超过 200 万,就自动切换成简单的行对行比较,并在结果开头用一行 # 注释说明。降级后是「大致对齐」而不是最少的编辑步骤——同一处改动可能显示成好几组增删,但足够一眼看出差异,而且不会卡住浏览器。再大的数据建议直接用 git diff。

常见的坑

常见问题

为什么文本一长对比就变慢?

因为用的是 LCS,复杂度是行数相乘。两边各 2000 行是 400 万次比较,各 1 万行就是 1 亿次,浏览器单线程扛不住。本站两边合计超过 3000 行、或行数乘积超过 200 万就自动降级成简单的行对行比较。

「忽略首尾空白」和「忽略大小写」有什么区别?

忽略空白只管每行两端的空格和 Tab,行内的空格照旧参与比较;忽略大小写是把两边统一转成小写再比。两个选项可以同时勾,判定顺序是先归一化再比较。

为什么文件末尾多一个换行也会被标成差异?

最后那个换行符会让切分出来的行数多 1,于是末尾显示一行新增或删除。这是真实差异而不是工具的误判,但通常无意义,忽略即可——也可以配合「忽略首尾空白」让那个空行照样显示为空行。

被修改的行为什么显示成一红一绿两行?

逐行 diff 只判断整行相同还是不同,没有做行内字符级比较。所以一行改动会被拆成删除旧行和新增新行两条记录,本站再把相邻同位置的删增额外标上灰色 ~ 前缀,方便你一眼看出这是改动而不是纯插入。

对比结果会上传到服务器吗?

不会。算法就在这个页面里跑,断网后刷新页面依然可用。按 F12 看网络面板也不会发现上传请求——这正是这个站所有工具的承诺。

相关工具

文本处理去重、排序、去空行、大小写、加行号,多个选项可叠加 字数统计中英文分开统计字符、词、行、段落与阅读时长 JSON 格式化校验、美化、压缩 JSON,带语法高亮