文本去重工具
快速去除文本中的重复内容,支持按行、按词、按句去重
什么是文本去重?
文本去重工具用于删除文本中重复的行、词或条目,让列表更干净、更容易检查。它适合处理导入的 CSV 片段、关键词列表、邮箱集合、日志片段、商品编码、提示词版本和笔记内容,这些重复项常来自复制、合并或导出错误。真正需要注意的是比较规则:大小写、首尾空格、空行、标点、规范化方式和原始顺序都会影响两个条目是否应被视为相同。工具能加快清理,但不能替代业务判断;有些相似条目必须保留,小差异也可能代表不同含义。
使用说明
基本操作
- 在左侧文本框中输入或粘贴需要去重的文本
- 选择合适的去重模式(按行、单词、句子等)
- 按需调整选项(是否区分大小写、是否保持顺序等)
- 在右侧查看实时去重结果和统计信息
- 点击「复制」按钮将结果保存到剪贴板
模式说明
- 按行:将每一行视为独立单元,删除重复的行
- 按单词:以空格分隔文本,删除重复的单词
- 按句子:按句号、问号、感叹号分隔,删除重复的句子
- 按段落:以空行分隔,删除重复的段落
- 按字符:删除文本中重复出现的字符
使用场景
技术原理
去重是基于 JavaScript Set 的单次扫描。ECMAScript Set 使用 SameValueZero 相等算法(与 Array.prototype.includes 使用的比较方式相同,其中 NaN 等于 NaN,但 +0 等于 -0),规范要求其提供亚线性的平均查找效率 —— V8 将其实现为开放寻址哈希表,摊销插入为 O(1),因此整个扫描的时间复杂度为 O(n)。朴素方案 —— 推入结果数组并对每个元素调用 indexOf —— 时间复杂度为 O(n²),在约 1 万条记录时开始变得缓慢。拆分方式因模式而异:行模式按 /\r?\n/ 拆分以兼容 CRLF(Windows)和 LF(Unix)行尾,词模式按 /\s+/ 拆分,句模式按 /(?<=[.!?])\s+/ 拆分,段落模式按 /\n{2,}/ 拆分。每个单元在成为 Set 键之前会经过可选的规范化处理:trim() 去除首尾空格,toLowerCase() 实现不区分大小写匹配,String.prototype.normalize('NFC') 使组合形式(é, U+00E9)与分解形式(e + U+0301)的视觉相同字符串合并为单个条目。顺序被保留,因为结果数组按迭代顺序构建 —— Set 仅用作「是否已见过」的过滤器。同样的数据结构选择支撑着 SQL DISTINCT 和 Python set();对于数千万条记录的唯一真正替代方案是概率性布隆过滤器,它以较小的误报率(每元素约 10 比特时约 1%)换取恒定内存,对于浏览器端文本工具来说属于过度设计。
- Set 查找使用 SameValueZero 算法(ECMA-262 §7.2.10)—— NaN 匹配 NaN,+0 匹配 -0,其余严格相等
- V8 将 Set 实现为哈希表;insert 和 has 的摊销时间为 O(1),使整个去重为 O(n),而基于 indexOf 的方案为 O(n²)
- 行模式正则 /\r?\n/ 在一次拆分中处理 CRLF、LF 和末尾 CR;忽略此点会留下不可见的 '\r' 后缀,导致精确匹配失败
- Unicode 规范化通过 String.prototype.normalize('NFC') 将组合/分解形式(如 'é' U+00E9 与 'e' + U+0301)合并为一个键
- 不区分大小写模式仅将键小写化 —— 原始大小写的值保留在输出中,因此第一个 'ERROR' 保持原样,后续的 'error' 行被丢弃
- 顺序保留是免费的:结果数组按输入顺序构建,Set 仅作为过滤器,因此行为类似具有稳定排序的 SQL DISTINCT
- 对于 1000 万条以上内存成为瓶颈的场景,布隆过滤器(每元素约 10 比特,1% 误报率)可替代 Set —— 在浏览器中不需要,100 万条字符串的 Set 轻松控制在 100 MB 以内
示例
按行去重,保留首次出现
输入:
apple
banana
apple
orange
banana
输出:
apple
banana
orange去除两侧空白后再按行去重
输入:
hello
hello
hello
world
输出(去除空白后):
hello
world忽略大小写去重
输入:
ERROR
error
Warning
WARNING
warning
输出(忽略大小写):
ERROR
Warning提取唯一邮箱列表
输入:
alice@example.com
bob@example.com
ALICE@example.com
carol@example.com
bob@example.com
输出(忽略大小写,按行):
alice@example.com
bob@example.com
carol@example.com按词去重
输入:hello world hello again world
输出:hello world again按句去重
输入:This is a test. This is a test. Another sentence.
输出:This is a test. Another sentence.常见问题
什么样算重复?
每个单元(行、单词、句子、段落或字符)会与其他单元逐一比较,完全相同的单元就是重复项。可切换是否区分大小写。页面会输出去重后的结果,并报告共移除多少个重复项。
会保留原始顺序吗?
会——每个唯一项的首次出现保留在原位,后续重复项会被剔除。输出结果保持原有顺序。
空行会被当作重复吗?
空行与其他行一样参与比较。第一个空行会被保留;后续与之相同的空行会和其他重复项一起被移除。
可以按子串或某一列去重吗?
不可以。去重基于每个单元(行、单词、句子、段落或字符)的完整内容。本工具不支持按列或按子串去重模式。
会对输出结果排序吗?
不会。输出始终保持原始顺序,没有排序选项。
能处理多大的文件?
上限取决于浏览器内存。桌面浏览器可处理数十万行。数百万行级别的文件会内存溢出,这种情况建议使用 `sort -u` 或 `awk '!seen[$0]++'` 等命令行工具。
我的文本会被上传吗?
不会。去重在浏览器中借助内存中的 Set 完成,粘贴的内容不会被传输。