列表比较
文本处理
正在载入
正在加载工具
工具代码会在打开时按需载入,请稍候。
本工具的全部运算都发生在你的浏览器中,输入内容不会发送到任何服务器。
关于这个工具
比较标识符、标签或任务名称列表,不把内容转换为数字。每个物理行是一个项目,结果包括交集、A 减 B、B 减 A、并集和对称差集。可仅对比较键修剪首尾空白,或按 JavaScript 小写规则忽略大小写。结果保留首次原始写法与来源行号,共有键不会悄悄改写导出的值。所有处理都在浏览器本地完成;匹配只是字符串比较,不能证明真实身份、账户归属或现实中的等价关系。
常见用途
- 比较两次库存编号快照,完整保留前导零和超长数字标识符。
- 查找两侧共有标签、新增或缺少项目,按明确来源顺序合并去重列表。
- 在准备本地文本导出前检查重复标签、首尾空白与大小写差别。
使用方法
- 1.在 A、B 中按每行一个项目粘贴,或选择严格 UTF-8 文件。CRLF、LF、CR 分行,其他 Unicode 分隔字符留在项目中。文件开头的 BOM 保留为 U+FEFF 文本。
- 2.选择是否修剪比较键、是否区分大小写,再运行比较。默认不修剪且区分大小写。检查各侧切分行、忽略空键、非空出现、唯一键和额外重复计数。
- 3.选择五种集合之一,检查 ASCII 转义原文、比较键、首次来源行和两侧次数。审阅警告后复制或下载;TXT 只导出所选集合,JSON 包含两侧完整输入与全部五种集合。
可执行示例:ASCII JSON 请求与预期原始项目
五种集合结果
{"a":"red\nblue","b":"blue\ngreen","options":{"trim":false,"caseSensitive":true}}{"intersection":["blue"],"aOnly":["red"],"bOnly":["green"],"union":["red","blue","green"],"symmetricDifference":["red","green"]}交集使用 A 的 blue;并集保留 A 顺序,再追加仅 B 的 green。
首次出现与重复次数
{"a":"b\na\nb\na","b":"a\na\nc","options":{"trim":false,"caseSensitive":true}}{"intersection":["a"],"aOnly":["b"],"bOnly":["c"],"union":["b","a","c"],"symmetricDifference":["b","c"]}同键只保留一个代表。共有 a 来自 A 第 2 行,countA 和 countB 均为 2。
修剪键但保留原文
{"a":" Ada \nAda","b":"Ada\n Bob ","options":{"trim":true,"caseSensitive":true}}{"intersection":[" Ada "],"aOnly":[],"bOnly":[" Bob "],"union":[" Ada "," Bob "],"symmetricDifference":[" Bob "]}A 的两种写法同为 Ada 键;导出的代表仍保留原来的首尾空格。
默认区分大小写
{"a":"Ada","b":"ada","options":{"trim":false,"caseSensitive":true}}{"intersection":[],"aOnly":["Ada"],"bOnly":["ada"],"union":["Ada","ada"],"symmetricDifference":["Ada","ada"]}启用区分大小写时,Ada 和 ada 是两个不同项目。
与语言区域无关的小写
{"a":"Ada\nADA","b":"ada\nBOB","options":{"trim":false,"caseSensitive":false}}{"intersection":["Ada"],"aOnly":[],"bOnly":["BOB"],"union":["Ada","BOB"],"symmetricDifference":["BOB"]}Ada 与 ADA 共用一个小写键,共有项目采用 A 的首次写法。
德语锐 s 不等于 ss
{"a":"\u00df\nSS","b":"ss","options":{"trim":false,"caseSensitive":false}}{"intersection":["SS"],"aOnly":["\u00df"],"bOnly":[],"union":["\u00df","SS"],"symmetricDifference":["\u00df"]}SS 转小写为 ss;ß 转小写不会变成 ss。
希腊 sigma 的上下文
{"a":"\u03a3\n\u039f\u03a3","b":"\u03c3\n\u03bf\u03c3","options":{"trim":false,"caseSensitive":false}}{"intersection":["\u03a3"],"aOnly":["\u039f\u03a3"],"bOnly":["\u03bf\u03c3"],"union":["\u03a3","\u039f\u03a3","\u03bf\u03c3"],"symmetricDifference":["\u039f\u03a3","\u03bf\u03c3"]}Σ 变为 σ,但 ΟΣ 的末尾字母变为 ς,与显式写出的 οσ 不同。
土耳其字母 I 不做区域调整
{"a":"I\n\u0130\n\u0131","b":"i\ni\u0307","options":{"trim":false,"caseSensitive":false}}{"intersection":["I","\u0130"],"aOnly":["\u0131"],"bOnly":[],"union":["I","\u0130","\u0131"],"symmetricDifference":["\u0131"]}I 变为 i,İ 变为 i 加组合点;无点的 ı 仍独立。
不自动 Unicode 规范化
{"a":"\u00e9","b":"e\u0301","options":{"trim":false,"caseSensitive":true}}{"intersection":[],"aOnly":["\u00e9"],"bOnly":["e\u0301"],"union":["\u00e9","e\u0301"],"symmetricDifference":["\u00e9","e\u0301"]}预组字符 é 与 e 加组合重音虽然相似,仍视为不同项目。
标识符始终是字符串
{"a":"001\n1\n9007199254740993\n__proto__","b":"1\n9007199254740992\nconstructor","options":{"trim":false,"caseSensitive":true}}{"intersection":["1"],"aOnly":["001","9007199254740993","__proto__"],"bOnly":["9007199254740992","constructor"],"union":["001","1","9007199254740993","__proto__","9007199254740992","constructor"],"symmetricDifference":["001","9007199254740993","__proto__","9007199254740992","constructor"]}前导零、超过安全 Number 精度的整数和类似原型属性的名称均原样保留。
未修剪时空白也是数据
{"a":"\n \n\t\n","b":"","options":{"trim":false,"caseSensitive":true}}{"intersection":[],"aOnly":[" ","\t"],"bOnly":[],"union":[" ","\t"],"symmetricDifference":[" ","\t"]}仅忽略空键。关闭修剪时,一个空格和一个制表符仍是两个唯一项目。
修剪后空键被忽略
{"a":"\n \n\t\n","b":"","options":{"trim":true,"caseSensitive":true}}{"intersection":[],"aOnly":[],"bOnly":[],"union":[],"symmetricDifference":[]}A 的所有行都变成空键;末尾 LF 仍贡献一个物理切分行。
CRLF、CR 与 LF 分隔
{"a":"a\r\nb\rc\n","b":"c\na","options":{"trim":false,"caseSensitive":true}}{"intersection":["a","c"],"aOnly":["b"],"bOnly":[],"union":["a","b","c"],"symmetricDifference":["b"]}A 切为四行,含末尾空行。匹配保留 A 顺序,来源行号从 1 开始。
BOM 与 Unicode White_Space 不同
{"a":"\ufeffx\n\u0085x","b":"x","options":{"trim":true,"caseSensitive":true}}{"intersection":["\ufeffx"],"aOnly":["\u0085x"],"bOnly":[],"union":["\ufeffx","\u0085x"],"symmetricDifference":["\u0085x"]}String.trim 去除首尾 U+FEFF,却保留不属于 ECMAScript 修剪空白的 U+0085 NEL。
仅去除边缘不换行空格
{"a":"\u00a0x\u00a0\nx\u00a0y","b":"x\nx y","options":{"trim":true,"caseSensitive":true}}{"intersection":["\u00a0x\u00a0"],"aOnly":["x\u00a0y"],"bOnly":["x y"],"union":["\u00a0x\u00a0","x\u00a0y","x y"],"symmetricDifference":["x\u00a0y","x y"]}修剪仅去除键的首尾 NBSP;内部 NBSP 仍与普通空格不同。
U+2028 不是列表分隔符
{"a":"a\u2028b","b":"a\nb","options":{"trim":false,"caseSensitive":true}}{"intersection":[],"aOnly":["a\u2028b"],"bOnly":["a","b"],"union":["a\u2028b","a","b"],"symmetricDifference":["a\u2028b","a","b"]}仅 CRLF、LF、CR 分行;项目中的 Unicode 行分隔符保留在同一个项目内。
有风险文本保持字面数据
{"a":"<img src=x onerror=alert(1)>\n=1+1\n\u202eabc\n\u0000","b":"=1+1","options":{"trim":false,"caseSensitive":true}}{"intersection":["=1+1"],"aOnly":["<img src=x onerror=alert(1)>","\u202eabc","\u0000"],"bOnly":[],"union":["<img src=x onerror=alert(1)>","=1+1","\u202eabc","\u0000"],"symmetricDifference":["<img src=x onerror=alert(1)>","\u202eabc","\u0000"]}类似 HTML 的文本、公式、双向控制和 NUL 仅作为数据。ASCII 预览将其显示,原始 TXT 仍原样携带。
JSON 无损保留不成对代理项
{"a":"\ud800","b":"\ud800\nx","options":{"trim":false,"caseSensitive":true}}{"intersection":["\ud800"],"aOnly":[],"bOnly":["x"],"union":["\ud800","x"],"symmetricDifference":["x"]}共有的高代理项仍是精确 UTF-16 码元。该集合禁止 TXT,但转义 JSON 可无损保留。
常见误区
- 把重复出现当成多个集合成员,而不是一个键与出现次数。
- 将忽略大小写误认为 Unicode 大小写折叠、土耳其专用转换或去重音。
- 把显示用转义文本与 TXT、JSON 携带的原始值混为一谈。
- 期待 TXT 保留原始换行符、重复行、忽略行或来源元数据。
- 以为 JSON 只含所选结果而分享,忽略其中还包含两侧完整列表。
限制与说明
- 精确修剪集合:U+0009, U+000A, U+000B, U+000C, U+000D, U+0020, U+00A0, U+1680, U+2000–U+200A, U+2028, U+2029, U+202F, U+205F, U+3000, U+FEFF。这是 ECMAScript String.trim 空白,不是 Unicode White_Space 属性;包含 U+FEFF,不含 U+0085 和 U+200B。CR、LF 先作为列表分隔符处理。只有首尾空白影响键,原始写法保留。 忽略大小写使用当前运行时与语言区域无关的 ECMAScript String.prototype.toLowerCase,不是 Unicode 大小写折叠或区域排序。希腊 Σ 按上下文变为 σ 或末尾 ς;ß 不等于 ss;土耳其 İ 变为 i 加组合点。不做 NFC、NFD、NFKC、NFKD、去重音、全半角转换、模糊匹配或身份推断。
- 每侧最多 131,072 个 UTF-16 码元、10,000 个物理切分行。空输入计为一个被忽略的行,末尾分隔符另加一个被忽略的行。文件须为严格 UTF-8,最多 524,288 字节;无效字节拒绝而非替换。BOM 保留,仅启用修剪时从比较键边缘去除 U+FEFF。浏览器粘贴或剪贴板可能在工具前后改变换行。 最多 20,000 个唯一条目,五种集合合计最多 60,000 个条目引用。界面最多显示 300 行,每个预览单元格最多 256 个 UTF-16 码元,省略会提示。TXT 最多 1,048,576 个 UTF-8 字节,ASCII JSON 最多 8,000,000 字节。超限阻止导出,不静默截断;修改输入或比较选项使旧结果失效。
- 忽略空比较键。每侧额外重复数等于非空出现次数减唯一键数。每键保留首次原文和从 1 开始的来源行。共有键采用 A;基于 A 的结果按 A 顺序,仅 B 记录按 B 顺序。并集与对称差集先列 A 项目,再追加仅 B 项目。不转为数字、不排序、不按重复次数展开。
- TXT 用 LF 连接所选原始项目,不追加末尾 LF。控制字符、双向字符、类似 HTML 的文本与电子表格公式前缀原样保留,不提供 CSV 或公式保护。不成对 UTF-16 代理项阻止原始 TXT 复制和下载,防止替换损失。ASCII 安全预览不代表原文可安全用于其他程序,请审阅目标用途。
- JSON 无损保留两侧完整原文,包括被忽略行、重复写法和原始 CRLF/CR/LF,以及选项、统计与全部五种集合;非 ASCII、控制和不成对代理项均转义。其范围大于当前所选集合,不是匿名化或加密。工具不上传、远程查询或持久化输入;复制和保存需用户明确操作。
常见问题
列表比较与逐行文本对比有什么不同?
集合比较键是否存在,并把重复键合为一项,不对齐对应行,也不比较相邻行的编辑。需要关注行位置和改动片段时请使用文本对比。
修剪或忽略大小写会改变导出写法吗?
选项只改变匹配键,代表值仍是来源侧第一次出现的原文,包括空格和大小写。共有键采用 A,因此交换 A、B 可能改变代表写法及结果顺序。
为什么看起来相同的项目未匹配?
不同 Unicode 序列、不换行空格、零宽字符或大小写规则可能产生不同键。工具不做规范化或身份推断。请先检查 ASCII 键预览,再决定是否另外清理。
原始导出能安全地直接放进电子表格吗?
TXT 没有公式保护,也不是 CSV。电子表格可能解释 =、+、-、@ 等前缀,或将数字样式标识符转成数字。JSON 保留字符串和元数据,但也包含两侧完整输入。使用前应审阅目标程序及数据。