在线文本对比与差异工具
在浏览器内即时对比两段文本。双栏并排展示、行内单词级高亮、统一 diff 补丁导出,支持忽略大小写、空白与空行。100% 本地浏览器处理,无需上传,文本不离开你的设备。
忽略选项
什么是文本对比?
文本对比是对两份文档进行结构化比较,找到将一份转换为另一份所需的最小插入与删除集合。输出会让变化可视化:新增行用绿色、删除行用红色,可双栏并排展示,也可以输出为 `git`、GitHub 与 Unix `patch` 命令使用的 `---/+++/@@` 统一补丁格式。
底层上,几乎所有现代 diff 都是最长公共子序列(LCS)算法。Eugene Myers 1986 年的 O((N+M)D) 论文是经典高效实现;经典动态规划(本工具采用,配合前缀/后缀裁剪)则更简单,对于典型 Web 场景输入工作得很好。行级对齐之后,相邻的删除 + 新增对会进入第二轮 token 级 LCS,渲染层只高亮一行内真正变化的单词 —— 评审人称之为行内 diff 或单词级 diff。
为什么不直接按字符比对?因为编辑很少是「扁平」的:在一份 200 行文件中间插入一行,会让下方每一行都偏移。朴素的 `===` 会把后面 199 行都算作不同。LCS 才告诉你真相:新增 1 行,199 行未变。
本工具的整个对比都在你的浏览器中运行。不上传、不写临时文件、不留日志。对专有代码、红线合同、私有日志,任何你不希望粘到第三方服务器上的内容都安全。需要对比 JSON?请使用结构化的 JSON Diff,这样键顺序与空白就不再是噪声。在比较 YAML 或 CSV 配置?先用 YAML 转 JSON 或 JSON 转 CSV 转换,再用与格式匹配的工具 diff。
// Two strings that look 'mostly the same' but a naïve check disagrees const a = 'hello world'; const b = 'hello, world!'; // Character equality a === b; // false — but only 3 characters actually changed. // LCS-style diff (this tool, at line + word granularity) // → 1 line modified, inline highlight: 'hello[, ]world[!]' // → unified patch: // --- original // +++ modified // @@ -1 +1 @@ // -hello world // +hello, world!
核心特性
双栏 + 统一双视图
在双栏可视化视图(供人工阅读)与统一 diff 补丁格式(用于 `git apply`、评审工具、bug 报告)之间一键切换。
行内单词级高亮
当两行被配对为修改时,只有变化的 token 带有彩色背景。你的视线会立刻落在编辑处,而不是扫过 80 个字符。
忽略大小写 / 空白 / 空行
四个独立开关:大小写、所有空白、仅行尾空白、空行。两次点击即可复现 `git diff -i -w -b`。
统一 diff 导出
复制带 3 行上下文的干净 `---/+++/@@` 补丁。可直接粘进 PR 评论、bug 报告或交给 `patch -p1` 应用。
100% 浏览器内运行
输入永不离开你的设备。不上传、不对文本做任何分析。页面加载后可离线工作。对专有代码与机密文本安全。
Unicode 与 RTL 支持
按 Unicode 单词边界切分 token。阿拉伯语、希伯来语、CJK 内容均可干净对比;CRLF、LF、CR 行尾变体都会被规范化。
示例
代码评审 — 一次变量重命名
function getUser(id) {
const u = db.users.find(x => x.id === id);
return u;
} function getUser(userId) {
const u = db.users.find(x => x.id === userId);
return u;
} 双栏视图高亮每一行重命名涉及的行,而行内 word diff 会让未改动的 token 变暗,评审人能一眼看出具体改了哪个标识符。
合同修订 — 新增一条条款
1. The service is provided as-is. 2. Either party may terminate with 30 days notice. 3. Disputes are resolved in California courts.
1. The service is provided as-is. 2. Either party may terminate with 30 days notice. 2a. Termination notice must be in writing. 3. Disputes are resolved in California courts.
新增的单条条款(第 2a 行)是唯一差异。上下文行保持整洁,非常适合合同或政策文档的红线标注。
日志排查 — 请求耗时变化
GET /api/users 200 14ms POST /api/orders 201 88ms GET /api/orders/42 200 21ms
GET /api/users 200 14ms POST /api/orders 201 4200ms GET /api/orders/42 500 21ms
两行发生变化。行内高亮显示 88ms → 4200ms 的延迟漂移以及 200 → 500 的状态码异常,事故时间线排查的标准动作。
行尾空白 — 切换「忽略行尾」选项
margin: 0; padding: 0; border: none;
margin: 0; padding: 0; border: none;
默认情况下,第 1 行会被标记为差异(多了行尾空格)。打开「忽略行尾空格 / 制表符」选项,差异归零,与 `git diff -b` 的行为一致。
使用方法
- 1
粘贴两个版本
原始文本放左侧,修改后的文本放右侧。边输入边渲染 diff;合并大于 200 KB 的输入会切换为手动 Diff 按钮。
- 2
按需打开忽略选项
忽略大小写、忽略所有空白、忽略行尾空格、忽略空行 —— 各自独立,跨访问保留。
- 3
阅读 diff 或获取补丁
双栏视图供人工阅读,统一视图获得 `---/+++/@@` 补丁格式。「复制统一 diff」将干净的补丁复制到剪贴板,可用于代码评审或 `patch -p1`。
常见 Diff 陷阱
Windows 与 Unix 互拷后整文件「全变了」
如果你从 Windows Notepad 粘贴到 Unix 编辑过的原文里,每一行都会出现 \r 差异。打开「忽略行尾空格 / 制表符」即可消除 CR 字符的噪声。
Diff: 200 处修改(全是行尾 \r 引起)
忽略行尾空格 / 制表符 → 2 处真实改动
仅缩进差异却铺天盖地
Tab ↔ 空格的重新格式化会把行级 diff 炸到无法看。「忽略所有空白」会把 diff 收敛到真正的语义改动。
Diff: 87 处修改(全是缩进变化)
忽略所有空白 → 4 处真实改动
因为多了一个空行,整段被标为变化
散文中增加或删除一个空行,可能让整个区域错位。「忽略空行」无需改动内容即可修正。
Diff: 第 2 段「完全变了」(只是空行位置移动)
忽略空行 → 第 2 段无变化
diff 显示「相同」,但文件确实不同
几乎总是因为上次会话的某个忽略选项还开着。打开「忽略选项」面板 —— 所有开关都列在那里。要做字节级严格对比,把它们全部关掉。
显示 0 处差异,但 `cmp` 说文件不同
关闭所有忽略选项 → 真实的 diff 出现
粘进 JSON 看起来「全变了」
文本 diff 把键顺序视为有意义,而 JSON 不是。JSON 载荷请用专门的 JSON Diff,它会忽略键顺序并尊重类型严格性。
对 JSON 做文本 diff: 100% 行变化(其实只是键重排)
<a href="/zh/tools/json-diff">JSON Diff</a>: 0 处差异
忽略了「diff 已截断」警告
每边超过 5,000 行的输入会被截断。看到警告就改用命令行 `diff -u file1 file2` 或 `git diff --no-index` —— 两者都以流式方式处理 GB 级文件。
粘了 20,000 行日志 —— 只对比了前 5,000 行
在终端用 `diff -u a.log b.log` 处理完整文件
常见使用场景
- 代码评审片段
- 把同一函数的两个版本丢进左右两栏,一眼看出重命名、被删除的分支或新增的守卫子句。对于一行级别的改动,行内单词高亮比扫 GitHub diff 还快。
- 合同 / 政策红线对比
- 粘贴昨日合同与今日修订版。新增条款一目了然,未变段落淡为灰色。导出统一补丁作为法务评审留痕。
- 日志时间线排查
- 拿事故前的日志切片对比事故中的日志切片。延迟、状态码、频率漂移立刻浮现,无需 `awk`。
- 稿件 / 草稿修订
- 粘贴你的草稿与编辑修改后的版本。行内单词 diff 精准展示哪些句子被重写 —— 用于逐条接受或拒绝改动非常宝贵。
- 翻译评审
- 把旧译本对比重译版,确认新文本保留了语义、结构与占位符。开启「忽略行尾空格」可消除译者常引入的尾随空白噪声。
- 配置 / .env 文件审计
- 对比两份 `.env`、`docker-compose.yaml` 或 shell rc 文件。打开「忽略空行」后,diff 会聚焦于功能性差异而非格式波动。
技术细节
- 带前缀/后缀裁剪的 LCS
- 运行动态规划 LCS 之前,会先剥掉公共前导与后缀行。「两份 2,000 行配置仅一行不同」的 diff 会坍缩成 1×1 的 DP 表,渲染时间不到 1 毫秒。
- Token 级行内 diff
- 相邻的删除 + 新增 hunk 被配对,并按 Unicode 的单词/非单词/空白连串切 token。第二轮 LCS 产出绿/红 token 段,让修改行可读。
- 统一 diff 与 git/patch 兼容
- 输出遵循为 GNU patch 定义的 `---/+++/@@ -L,C +L,C @@` 格式,Git、GitHub 与所有代码评审工具都在用。可通过 `pbpaste | patch -p0` 应用。
- 每边 5,000 行的输入上限
- 超过上限会截断并告警。多 MB 输入请使用命令行 `diff -u` 或 `git diff --no-index`,它们以流式方式处理 GB 级文件。
最佳实践
- 先选好忽略选项再读
- 行尾空格、CRLF、大小写噪声会淹没信号。先打开正确的忽略选项,diff 会好读得多,你也不必再训练自己跳过「假」差异。
- 分享用统一 diff,评审用双栏
- 可视化列给你的眼睛看,统一 diff 给别人的终端。复制的统一 diff 可以无翻译地丢到 Slack 消息、Jira 评论或 `patch -p1` 里。
- 用相似度 % 做完整性检查
- 如果两份文件「基本相同」但相似度却只有 30%,你大概率遇到了行尾或空白问题。打开「忽略所有空白」再次比对,然后再读 diff。
常见问题
我粘贴的文本会发送到你们服务器吗?
文本 diff 和 JSON diff 有什么区别?
如何忽略空白、大小写或空行?
什么是统一 diff(unified diff)?何时需要复制它?
为什么只改了一个词,diff 却显示整行变了?
CRLF 与 LF 行尾如何处理?
两边输入最大能多大?
能用来 diff 代码吗?支持我用的语言吗?
为什么单次编辑有时显示为一删一加两行?
% 相似度是怎么计算的?
能把 diff 分享给同事吗?
diff 支持阿拉伯语、希伯来语等从右到左的语言吗?
相关工具
查看所有工具 →免费正则表达式测试器 — 在线实时匹配与调试
文本处理
在浏览器里实时测试正则表达式:高亮匹配、捕获组、命名分组、替换预览、字符串切分与逐 token 解释,支持 JavaScript(ECMA-262)方言、g/i/m/s/u/y/d 七个 flag、ReDoS 超时保护。100% 本地运行、免费、无需注册。
免费字数统计与字符计数工具
文本处理
在浏览器里实时统计单词数、字符数、句子、段落与阅读时间,并对照 Twitter、meta description、Instagram 等平台字符限制给出实时进度条。免费、隐私、无需注册。
进制转换器 — 二进制、十六进制、十进制、八进制互转
转换工具
在线免费进制转换工具,支持二进制、八进制、十进制、十六进制及 2-36 任意进制互转。无需注册,数据不离开浏览器,即时获取结果。
Base64 解码与编码工具
编码和格式化
免费在线 Base64 解码编码工具。实时转换,支持中文和 Emoji,100% 浏览器端运行,数据不离开设备,无需注册。
Crontab 生成器与 Cron 表达式构建工具
日期和时间
在浏览器里构建、校验并解读 cron 表达式,按本地时间或 UTC 实时预览下一次运行。支持 POSIX 五字段语法、常用预设和中文描述。免费、隐私、无需注册。
CSV 转 JSON 转换器
编码和格式化
在浏览器中将 CSV 转换为 JSON。支持 RFC 4180、类型推断、表头行、大整数安全。100% 隐私,无需上传。