空白与文本清理器,免费
通过移除多余空格、制表符和空行来清理杂乱文本。
使用方法
- 将您的文本粘贴到输入区。
- 选择所需的清理选项(默认全部勾选)。
- 点击「清理文本」以处理。
- 复制或下载清理后的结果。
常见问题
哪些字符算作空白?
空格、制表符、不换行空格和其他 Unicode 空白字符。换行符由「空行」和「合并换行」选项单独处理。
此工具会改变我的内容吗?
不会。它只移除或合并空白字符。您的文字、标点和其他内容保持不变。
可以用它处理代码吗?
可以,但请谨慎 · 移除行首空白会破坏代码缩进。使用单独的复选框精确控制要清理的内容。
「空白符」的真实含义
空白字符是在文本渲染时产生空白而非可见字形的字符,用于分隔单词、缩进行和换行段落。Unicode字符数据库将正式的White_Space属性分配给恰好25个码位。常见的成员(空格、制表符、换行符、回车符)涵盖了您粘贴时遇到的大多数情况,但完整列表还包括不换行空格(U+00A0)、窄不换行空格(U+202F)、U+2000-U+200A范围内的11个排版空格、行分隔符和段落分隔符(U+2028、U+2029)、中等数学空格(U+205F),以及CJK标点后使用的全角表意空格(U+3000)。
另一组字符看起来不可见,但不被Unicode归类为空白符:字节序标记(U+FEFF)、零宽空格(U+200B)、零宽连接符和零宽不连接符(U+200D、U+200C)、单词连接符(U+2060)和软连字符(U+00AD)。这些是格式控制字符,而非空格,大多数「我清理了文本但还是有问题」的反馈都源于其中之一。
此工具各选项的功能
- 修剪每行首尾空格:去除每行开头和结尾的空白符。适用于清理电子邮件中的缩进引用,或复制粘贴时意外添加的右侧填充。
- 将多个空格折叠为一个:两个或多个连续空格变为单个空格。处理句点后双空格的打字机习惯(大多数现代风格指南(Chicago、AP)不鼓励此做法)。
- 删除空行:丢弃任何空行或只含空白符的行。从PDF粘贴文本后常见的需求。
- 将制表符转换为空格:将每个
\t替换为空格。在代码中请谨慎:Python和YAML对空白符敏感,而Makefile的配方行实际上必须使用制表符缩进。 - 修剪整个文本首尾:一次性去除整个字符串开头和结尾的空白符(相当于JavaScript的
trim())。 - 将多个换行折叠为一个:连续的换行符变为单个换行符。当「删除空行」过于激进、您希望保留单个空行作为段落分隔时,此选项非常有用。
所有六个选项都是独立的开关(取消勾选您想跳过的任何选项),每个选项仅对您粘贴的文本运行。不会上传任何内容;清理通过JavaScript正则表达式在浏览器中本地进行。
适合使用的场景
- PDF和Word文档。PDF在每行视觉结尾插入硬换行符,有时还保留连字符;粘贴的Word文本通常在数字和单位之间(10 km)、法语标点周围,或在称谓「Mr. Smith」之后插入不换行空格。
- 规范化用户输入。「姓名」或电子邮件字段中的尾随空格导致
"Smith"和"Smith "比较不相等。在输入时(或查找前)去除这些空格,可以消除一整类「用户未找到」的错误。 - CSV和TSV准备工作。具有前导或尾随空格的字段值会破坏期望精确匹配键的下游解析器。Excel的UTF-8 CSV导出会悄悄在前面添加字节序标记,不去除BOM的下游解析器会将其视为第一列标题的一部分,产生奇怪的
colname。 - Markdown和博客草稿。多个连续空行在Markdown中渲染为单个块,但会使源文件臃肿并使差异(diff)变得嘈杂。
- 电子邮件签名、聊天记录和标识符:在粘贴到其他文档之前,或在将促销码或许可证密钥提交给对空白符严格的API之前,快速清理。
常见陷阱
- 删除前导空白符会破坏代码。Python和YAML使用缩进作为语法。去除后文件看起来一样,但无法解析。
- 制表符转换会破坏Makefile。如果配方行用空格而非制表符缩进,GNU make会拒绝运行。同样的注意事项也适用于Go的gofmt输出。
- NBSP看起来与普通空格完全相同。用户通常看到两个单词之间的单个「空格」,认为任何清理工具都能处理。现代浏览器中JavaScript的
\s正则确实匹配不换行空格,但如果您在其他语言(或非常旧的环境)中编写自己的正则,可能需要显式列出NBSP。 - Markdown中的尾随空白符是有意义的。Markdown行末的两个尾随空格会创建一个
<br>换行符。逐行修剪尾随空白符会删除这些换行符;如果您依赖它们,请关闭该选项。 - Windows行尾符。从Windows来源复制的文件使用CRLF(
\r\n)。「删除空行」和「折叠换行符」操作需要识别CR;否则每行末尾可能残留一个杂散的\r。 - 零宽字符在空白符删除后仍然存在。ZWSP(U+200B)、ZWJ(U+200D)、ZWNJ(U+200C)、单词连接符(U+2060)和软连字符(U+00AD)不是Unicode空白符,因此通用空白符清理工具不会处理它们。如果文本在清理后仍感觉有问题,请将其粘贴到十六进制查看器或单独的「不可见字符」检查器中。
- 注意输入与输出之间的差异。在此页面中一旦复制或关闭,清理操作就无法撤销,没有撤销历史。如果可能需要原始内容,请保留在其他地方。
简要技术背景
此工具完全在浏览器中使用JavaScript内置的正则表达式引擎运行。现代引擎(大约自2015年起的所有常青浏览器)中的String.prototype.trim()会去除不换行空格和字节序标记,因为ECMAScript规范将其修剪集定义为WhiteSpace和LineTerminator产生式的并集,该列表涵盖制表符、普通空格、NBSP、BOM、排版空格以及CR/LF/LS/PS换行符。它只排除一个Unicode空白字符:U+0085(NEL),这是继承自EBCDIC的奇特字符,几乎不出现在现代文本中。
对于非常大的输入,瓶颈很少在正则表达式处理上,而在于将结果写回文本区域并重新渲染DOM。现代笔记本电脑上通常可以轻松处理几兆字节以内的输入;超出此范围,命令行工具(tr、sed、awk或简短的Python脚本)通常更快。
更多问题
普通空格和不换行空格有什么区别?
它们的渲染宽度相同,但不换行空格(NBSP,U+00A0)告诉渲染器不要在该处换行。Word、Google Docs和许多CMS在称谓与姓名之间(Mr. Smith)、数字与单位之间(10 km)或货币符号前后($ 5)插入它。它是粘贴文本中最常见的「奇怪」字符,也是为什么两个单词之间看起来一样的间隔有时无法被针对普通空格编写的正则表达式捕获。
这会删除零宽字符或字节序标记吗?
JavaScript的空白符处理通常能捕获字节序标记(U+FEFF)。它不能捕获零宽空格(U+200B)、零宽连接符(U+200D)、零宽不连接符(U+200C)、单词连接符(U+2060)或软连字符(U+00AD),Unicode不将这些归类为空白符,因此它们在空白符处理后仍然存在,这是有意设计的。如果您怀疑文本中存在这些字符,需要使用不可见字符检查器。
为什么空行和连续换行是两个独立的选项?
「删除空行」会删除所有空行,结果是没有段落分隔的连续文本块。「将多个换行折叠为一个」在段落之间保留单个换行,只删除多余的。如果您希望输出中的段落可读,请关闭第一个选项并使用第二个。
是否有长度限制?
没有硬性限制,该工具可以轻松处理现代笔记本电脑上数万到数百万字符范围内的文本。限制来自浏览器的文本区域性能:非常大的粘贴操作在打字或复制时会开始卡顿,而不是在清理步骤本身。
有任何内容会发送到服务器吗?
不会。文本永远不会离开您的浏览器。清理在JavaScript中本地运行,结果写回同一页面上的文本区域,页面加载后可离线使用。这同样适用于Absolutool上的每一个工具。