空白处理
去首尾、合并空格、删全部空白、删 Tab、CRLF 与 LF 互转
空白处理:六种清理动作的适用场景
六个按钮各自做了什么
| 动作 | 行为 | 适合 |
|---|---|---|
| 去首尾 | 逐行去掉行首和行尾的空白 | 从网页、表格、PDF 复制来的文本,最常见的清理 |
| 合并空格 | 把连续的空格与制表符压成单个空格 | 修复排版错乱的对齐文本 |
| 删所有空白 | 删掉全部空白字符,包括换行 | 压缩成一整行、去掉标识符里的空格 |
| 删 Tab | 只删制表符,保留空格 | 把 Tab 缩进改成空格缩进(但不会补上空格,见下) |
| CRLF→LF | 把 Windows 换行转成 Unix 换行 | 提交到 Git、在 Linux 上运行、写 shell 脚本 |
| LF→CRLF | 把 Unix 换行转成 Windows 换行 | 给 Windows 记事本等老编辑器看 |
换行的坑: 会静默破坏数据
换行符不只有一种,这是跨平台故障的常见根源:
| 体系 | 字节序列 | 说明 |
|---|---|---|
| Unix / Linux / macOS 现代 | \n(LF,0x0A) | 事实标准,Git 与大多数工具默认 |
| Windows | \r\n(CRLF,0x0D 0x0A) | 记事本等的历史习惯 |
| 老式 Mac(OS 9 之前) | \r(CR,0x0D) | 几乎见不到了,但偶尔出现在老数据里 |
最典型的故障形态:整行内容看起来完全一样,但多了一个不可见的 \r。表现包括:
- 文本对比时整个文件标红,肉眼看不出任何区别。
- Shell 脚本报
command not found或bad interpreter——\r被当成解释器路径的一部分。 - CSV 的最后一列多出不可见字符,导入数据库时长度校验失败。
- 把带
\r的值拼接成 URL 或 JSON 时出现非法字符错误。 - 正则里的
$匹配失败(因为\r在行尾和$之间)。
所以"CRLF→LF"不只是一个格式偏好选项,而是排查"看不出区别但就是不对"这类问题的第一步。
Tab 转空格不是简单删除
"删 Tab"只是把制表符移除,不会插入等宽空格。所以 \tif (x) 会变成 if (x)——缩进层级消失了,而不是变成 4 个空格。
这对代码类文本通常不是想要的结果。要真正"Tab 转 4 空格",需要的是替换动作:用批量查找替换工具,把 \t(正则模式)替换成四个空格。制表符还能作为正则的 \t 直接匹配,所以这个替换很直接。
反过来的需求也常见:把空格缩进改成 Tab(减小文件体积、统一团队规范)。那是查找 (四个空格)替换为 \t,注意要按缩进层级从深到浅处理,否则会出错。这类格式化工作交给编辑器或 Prettier 这类工具更可靠。
合并空格不会处理换行
"合并空格"只处理空格和制表符,不动换行。所以段落结构会被保留。如果把换行也压掉,整段文本会变成一行——那是"删所有空白"的效果。
需要"把一段多行文本压成一行,但保留词间一个空格"时,正确做法是两步:先把换行替换成空格(用查找替换工具,正则 \s*\n\s* 替换为一个空格),再合并连续空格。
实践里的处理顺序
清理从外部复制来的文本,推荐这个顺序:
- CRLF→LF。先把换行统一,后面的处理才有一致的假设。
- 去首尾。逐行去掉首尾空白,消掉大部分格式噪声。
- 删 Tab 或替换成空格。按目标格式决定。
- 合并空格。需要保留对齐时跳过这一步。
- 去空行 / 去重。用按行去重排序工具收尾。
这个顺序会让每一步的输入都是干净的,避免"上一层的空白导致这一层的匹配失效"的连锁问题。全部处理在浏览器本地完成。
常见问题
"去首尾"是按整段还是按行?
按行处理:每行的前后空白都会被去掉,行内中间的空格保留。
CRLF 和 LF 是什么?
Windows 用回车+换行(CRLF,\r\n)作换行,Unix / macOS 与多数代码文件用换行(LF,\n)。互转用于跨平台对齐。