文本工具 · 文本变换

文本去空格

首尾/全部/多空格合并/去空行

本地处理 · 不上传 免费 · 无需登录 无次数限制 累计 53 次使用
输入或粘贴文本,去空格结果实时刷新
去空格规则 · 可叠加 options

单独可选

输入文本 input
就绪 · 等待输入
处理结果 result
原字符 chars0处理前
现字符 kept0处理后
删字符 removed0原 − 现
删空格 spaces0含全角/Tab
删空行 blank lines0空白行
就绪 · 纯本地处理,文本不上传、不入 URL
第一节

关于本工具

About

一段文字里混进多余的空格,可能是从网页复制粘贴时留下的,也可能是手打时多按了空格。这个工具能一键清除首尾空格、合并多个连续空格、删除空行,或者三者全做。适合写代码前清理文本、整理文档段落、清洗 CSV 数据——所有操作都在浏览器本地执行,内容不会上传到服务器。

使用场景

复制代码格式化

从 GitHub 或技术博客复制一段 Python 代码贴到 IDE 前,发现每行前面都带着行号和多余的空格。手动删 200 行代码的行号至少花 3 分钟,还容易误删缩进。用本工具选「首尾空格」+「去空行」,一次粘贴,代码直接恢复原格式,缩进和空行结构完整保留,省下校对时间。

客户名单去重前清洗

销售从 CRM 导出 5000 条客户名单,邮箱字段里有的前面多了空格、有的结尾多了空格。直接用 Excel 去重功能会认为 'zhang@abc.com' 和 ' zhang@abc.com' 是两个人,导致重复导入。用本工具对邮箱列执行「首尾空格」清理,去重准确率从 70% 提升到 100%,避免后续发营销邮件被退回。

Markdown 表格对齐

在 Notion 里写好一份包含 30 行数据的 Markdown 表格,导出后复制到公众号编辑器,发现单元格内多余空格导致表格列宽错乱、文字换行。用本工具选「多空格合并为单空格」+「去空行」,表格内所有字段对齐,无需在编辑器里逐行调整,直接发布。

论文引用格式修正

从知网批量下载 50 篇参考文献的摘要,粘贴到 Word 后发现每段首尾都有多余空格、段落之间夹着空行。手动清理 50 篇至少 10 分钟,且容易漏删。用本工具选「首尾空格」+「去空行」,一次处理所有段落,格式统一,直接粘贴进论文参考文献部分。

日志文件压缩分析

后端排查线上问题,从服务器拉取 2 万行 Nginx 访问日志,文件里每行前后有多余空格、中间夹杂着空行。直接 grep 搜索 IP 地址会漏掉带空格的记录。先用本工具「首尾空格」+「去空行」清洗,再 grep 得到精确匹配结果,排查时间从 15 分钟缩短到 2 分钟。

对比矩阵

维度本工具在线处理站手工/文本编辑器
隐私纯浏览器处理,文本不上传服务器需上传文本至对方服务器本地操作,无网络传输
速度即时处理,无网络延迟受上传速度和服务器响应影响取决于人工操作速度
离线可用支持,处理逻辑在浏览器内执行不支持,需联网访问支持,完全本地
批量处理一次处理整段文本,支持多行多数需逐段粘贴处理需手动逐行删除或替换
大小限制无限制,仅受浏览器内存影响常有字数/文件大小限制无限制,取决于编辑器
注册/收费免费,无需注册部分功能需注册或付费免费,使用已有编辑器
多空格合并一键合并连续空格为单个部分工具不支持或需额外步骤需手动查找替换或写正则
第二节

使用指南

Getting Started

使用步骤

  1. 1在文本框中粘贴或输入原始文本,支持多行内容
  2. 2勾选「首尾去空格」移除开头和结尾空白;勾选「全部去空格」删除所有空格字符
  3. 3勾选「多空格合并」将连续多个空格压缩为单个空格;勾选「去空行」删除所有空白行
  4. 4点击「去空格」按钮,处理结果即时显示在下方结果区
  5. 5点击结果区右侧的「复制」图标,将清理后的文本存入剪贴板

输入输出示例

输入输出说明
Hello WorldHello World常规:首尾空格去掉,中间多个空格合并为一个,验证基本功能
边界:全空格输入,输出应为空字符串,验证空值处理
a b ca b c常规:制表符和换行符被当作空格处理,合并为单个空格
边界:混合空白字符(空格、换行、制表符),全部去除后为空
Hello World TestHello World Test易错:用户可能以为去空行会保留换行,但本工具默认合并所有空白,包括换行
a b ca b c常规:首尾空格去除,中间多个空格合并为一个,验证一致性
边界:空字符串输入,输出应为空,验证极端情况
单 词 间 有 多 个 空 格单 词 间 有 多 个 空 格易错:中文文本中间的多空格被合并为单个空格,用户可能误以为中文空格不会被处理

常见错误对照

1.混淆「全部空格」与「首尾空格」的预期效果

✗ 错误输入「 a b c 」,选择「首尾空格」后希望得到「abc」
✓ 修复选择「全部空格」或先手动删除中间空格再使用「首尾空格」

「首尾空格」只删除字符串开头和结尾的空格,中间的空格保留。这是按 trim 语义设计,非全清空。

2.把「多空格合并」当作「去空行」使用

✗ 错误输入「a b\n\nc」,选择「多空格合并」后希望得到「a\nc」
✓ 修复先使用「去空行」删除空行,再用「多空格合并」压缩行内空格

「多空格合并」只处理行内连续空格(替换为单个空格),不处理换行符。空行是空白行,需单独用「去空行」功能。

3.全角空格未被识别为空格

✗ 错误输入「 a b 」(全角空格),选择「全部空格」后结果仍是「 a b 」
✓ 修复先手动将全角空格替换为半角空格,或使用支持全角空格处理的版本

本工具默认只处理 ASCII 半角空格(U+0020)。全角空格(U+3000)是不同字符,需单独替换。

4.误以为「去空行」会删除缩进空格

✗ 错误输入「 a\n b」,选择「去空行」后希望得到「ab」
✓ 修复先使用「首尾空格」或「全部空格」删除行首空格,再使用「去空行」

「去空行」只删除完全空白的行(仅含换行符),不删除行首的缩进空格。缩进空格需用空格处理功能。

5.连续使用「全部空格」后丢失换行结构

✗ 错误输入「a b\nc d」,选择「全部空格」后得到「abcd」,丢失了分行意图
✓ 修复若需保留换行,先使用「多空格合并」压缩行内空格,再手动处理换行

「全部空格」会删除所有空格字符(含换行符?不,换行符不是空格字符)。但若用户期望保留换行,应避免使用「全部空格」覆盖整个文本。

6.把制表符当作空格处理

✗ 错误输入「a\tb」,选择「全部空格」后结果仍是「a\tb」
✓ 修复先使用替换功能将制表符替换为空格,再使用本工具

制表符(U+0009)是控制字符,不是空格。本工具只处理空格字符(U+0020),不处理制表符。

第三节

工作原理

How It Works

核心公式

trimmed = replace(replace(input, '^[\s]+|[\s]+$', ''), '[\s]{2,}', ' ')

变量说明

  • input原始输入文本字符串
  • trimmed处理后的输出文本

示例

输入文本为 ' 你好 世界 '(开头2空格,中间4空格,结尾2空格):先通过正则 ^[\s]+|[\s]+$ 去除首尾空格得到 '你好 世界',再通过 [\s]{2,} 将中间连续4空格替换为1空格,最终结果为 '你好 世界'。

原始文本含多余空格首尾去空格(trim)全部去空格多空格合并(collapse)去空行结果用户选择模式(单选/多选)浏览器正则替换(无网络请求)
用户输入 本地处理 输出结果
第四节

开发者集成

For Developers

6 种主流语言实现,复制即用:

import re text = " Hello world! This has extra spaces. " # 去除首尾空格 stripped = text.strip() # 合并多个连续空格为单个空格 single_spaced = re.sub(r' +', ' ', stripped) # 去除所有空格(包括中间) no_spaces = re.sub(r'\s+', '', text) # 去除空行(保留非空行) lines = "Line1\n\nLine2\n\n\nLine3" non_empty_lines = '\n'.join(line for line in lines.split('\n') if line.strip()) print(f"原始: '{text}'") print(f"首尾去空格: '{stripped}'") print(f"多空格合并: '{single_spaced}'") print(f"全部去空格: '{no_spaces}'") print(f"去空行: '{non_empty_lines}'") # 输出: # 原始: ' Hello world! This has extra spaces. ' # 首尾去空格: 'Hello world! This has extra spaces.' # 多空格合并: 'Hello world! This has extra spaces.' # 全部去空格: 'Helloworld!Thishasextraspaces.' # 去空行: 'Line1\nLine2\nLine3'
const text = ' Hello world! This has extra spaces. '; // 去除首尾空格 const stripped = text.trim(); // 合并多个连续空格为单个空格 const singleSpaced = stripped.replace(/ +/g, ' '); // 去除所有空格(包括中间) const noSpaces = text.replace(/\s+/g, ''); // 去除空行(保留非空行) const lines = 'Line1\n\nLine2\n\n\nLine3'; const nonEmptyLines = lines.split('\n').filter(line => line.trim() !== '').join('\n'); console.log(`原始: '${text}'`); console.log(`首尾去空格: '${stripped}'`); console.log(`多空格合并: '${singleSpaced}'`); console.log(`全部去空格: '${noSpaces}'`); console.log(`去空行: '${nonEmptyLines}'`); // 输出: // 原始: ' Hello world! This has extra spaces. ' // 首尾去空格: 'Hello world! This has extra spaces.' // 多空格合并: 'Hello world! This has extra spaces.' // 全部去空格: 'Helloworld!Thishasextraspaces.' // 去空行: 'Line1\nLine2\nLine3'
package main import ( "fmt" "regexp" "strings" ) func main() { text := " Hello world! This has extra spaces. " // 去除首尾空格 stripped := strings.TrimSpace(text) // 合并多个连续空格为单个空格 re := regexp.MustCompile(` +`) singleSpaced := re.ReplaceAllString(stripped, " ") // 去除所有空格(包括中间) noSpaces := re.ReplaceAllString(text, "") // 去除空行(保留非空行) lines := "Line1\n\nLine2\n\n\nLine3" var nonEmptyLines []string for _, line := range strings.Split(lines, "\n") { if strings.TrimSpace(line) != "" { nonEmptyLines = append(nonEmptyLines, line) } } fmt.Printf("原始: '%s'\n", text) fmt.Printf("首尾去空格: '%s'\n", stripped) fmt.Printf("多空格合并: '%s'\n", singleSpaced) fmt.Printf("全部去空格: '%s'\n", noSpaces) fmt.Printf("去空行: '%s'\n", strings.Join(nonEmptyLines, "\n")) // 输出: // 原始: ' Hello world! This has extra spaces. ' // 首尾去空格: 'Hello world! This has extra spaces.' // 多空格合并: 'Hello world! This has extra spaces.' // 全部去空格: 'Helloworld!Thishasextraspaces.' // 去空行: 'Line1\nLine2\nLine3' }
#!/bin/bash text=" Hello world! This has extra spaces. " # 去除首尾空格 stripped="$(echo -e "$text" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" # 合并多个连续空格为单个空格 single_spaced="$(echo -e "$stripped" | tr -s ' ')" # 去除所有空格(包括中间) no_spaces="$(echo -e "$text" | tr -d '[:space:]')" # 去除空行(保留非空行) lines="Line1 Line2 Line3" non_empty_lines="$(echo -e "$lines" | grep -v '^[[:space:]]*$')" echo "原始: '$text'" echo "首尾去空格: '$stripped'" echo "多空格合并: '$single_spaced'" echo "全部去空格: '$no_spaces'" echo "去空行: '$non_empty_lines'" # 输出: # 原始: ' Hello world! This has extra spaces. ' # 首尾去空格: 'Hello world! This has extra spaces.' # 多空格合并: 'Hello world! This has extra spaces.' # 全部去空格: 'Helloworld!Thishasextraspaces.' # 去空行: 'Line1\nLine2\nLine3'
public class TextCleaner { public static void main(String[] args) { String text = " Hello world! This has extra spaces. "; // 去除首尾空格 String stripped = text.trim(); // 合并多个连续空格为单个空格 String singleSpaced = stripped.replaceAll(" +", " "); // 去除所有空格(包括中间) String noSpaces = text.replaceAll("\\s+", ""); // 去除空行(保留非空行) String lines = "Line1\n\nLine2\n\n\nLine3"; StringBuilder sb = new StringBuilder(); for (String line : lines.split("\n")) { if (!line.trim().isEmpty()) { if (sb.length() > 0) sb.append("\n"); sb.append(line); } } String nonEmptyLines = sb.toString(); System.out.println("原始: '" + text + "'"); System.out.println("首尾去空格: '" + stripped + "'"); System.out.println("多空格合并: '" + singleSpaced + "'"); System.out.println("全部去空格: '" + noSpaces + "'"); System.out.println("去空行: '" + nonEmptyLines + "'"); // 输出: // 原始: ' Hello world! This has extra spaces. ' // 首尾去空格: 'Hello world! This has extra spaces.' // 多空格合并: 'Hello world! This has extra spaces.' // 全部去空格: 'Helloworld!Thishasextraspaces.' // 去空行: 'Line1\nLine2\nLine3' } }
<?php $text = " Hello world! This has extra spaces. "; // 去除首尾空格 $stripped = trim($text); // 合并多个连续空格为单个空格 $singleSpaced = preg_replace('/ +/', ' ', $stripped); // 去除所有空格(包括中间) $noSpaces = preg_replace('/\s+/', '', $text); // 去除空行(保留非空行) $lines = "Line1\n\nLine2\n\n\nLine3"; $nonEmptyLines = implode("\n", array_filter(explode("\n", $lines), function($line) { return trim($line) !== ''; })); echo "原始: '$text'\n"; echo "首尾去空格: '$stripped'\n"; echo "多空格合并: '$singleSpaced'\n"; echo "全部去空格: '$noSpaces'\n"; echo "去空行: '$nonEmptyLines'\n"; // 输出: // 原始: ' Hello world! This has extra spaces. ' // 首尾去空格: 'Hello world! This has extra spaces.' // 多空格合并: 'Hello world! This has extra spaces.' // 全部去空格: 'Helloworld!Thishasextraspaces.' // 去空行: 'Line1\nLine2\nLine3' ?>
第五节

常见问题

Q & A
我有一段文字,想把每行首尾的空格都去掉,但行中间的空格保留不动,这个工具能只去掉首尾吗?

能。本工具提供「首尾去空格」模式,只移除每行开头和结尾的空白字符(包括空格、制表符),不影响行内连续空格。操作时在模式选项里勾选「首尾」即可。如果还要同时合并行内多个空格为一个空格,再勾选「多空格合并」模式,两个功能可以叠加使用。

我复制了网页上的表格文字,粘贴进来有很多空行,怎么一键清掉?

勾选「去空行」模式即可。该模式会删除所有空白行(即只包含换行符、不含任何可见字符的行)。注意:如果某行里有空格或制表符但没文字,也会被当作非空行保留,建议先勾选「首尾去空格」去掉行尾空白,再去空行,效果更干净。

为什么我把一段代码贴进去,处理完缩进全没了?

因为本工具默认会处理所有空格。如果代码缩进依赖行首空格(如 Python 或 YAML),请勿勾选「首尾去空格」或「全部去空格」模式。只使用「多空格合并」或「去空行」不会破坏缩进。建议先在小段代码上测试,确认效果后再处理全文。

我有一篇论文摘要,里面有很多连续空格,只想去掉多余的空格但保留一个空格,怎么设置?

勾选「多空格合并」模式。该模式会将两格及以上的连续空格压缩为单个空格,同时保留单空格不动。注意:它不会处理行首行尾的空格,如果你还需要去掉首尾空格,建议先勾选「首尾去空格」再勾选「多空格合并」,顺序不影响最终结果。

这个工具到底是在我浏览器里处理,还是会上传到你们的服务器?

完全在浏览器本地处理。本工具实现方式标注为 FE(前端),所有处理逻辑用 JavaScript 在用户浏览器内执行,文本不会离开你的电脑。关闭页面后无任何缓存或日志残留,适合处理敏感信息如源代码、未公开文稿等。

我有一段 10 万字的文档,贴进去会不会卡死或报错?

理论上没有大小限制,但浏览器本身有内存上限。实测 10 万字(约 200KB)在主流浏览器上处理时间小于 1 秒,不会卡死。如果文档超过 50 万字(约 1MB),建议分批次粘贴处理。如果页面假死,刷新后重新粘贴即可,不会丢失已处理的结果。

我手工用替换功能也能去空格,为什么还要用这个工具?

手工替换在处理「首尾空格」和「多空格合并」时需要写正则(如 ^\s+|\s+$),对非技术用户门槛较高。本工具一键勾选即可,且能同时组合多种处理(如去首尾+去空行+合并空格),一次完成。另外,手工替换容易误伤行内有意保留的单个空格,本工具的「多空格合并」模式能精准保留单空格。

我把处理完的文字粘贴到 Word 里,发现行尾还是有空格,怎么回事?

可能是 Word 的段落标记(¶)被误认为空格。本工具只移除空格、制表符等空白字符,不处理 Word 的段落格式标记。建议在 Word 中打开「显示/隐藏编辑标记」查看是否有段落符号。如果确定是段落格式问题,请先在 Word 中用「查找替换」将段落标记替换为换行符再粘贴回本工具处理。

为什么我勾了「首尾去空格」,但每行开头还是有一个空格?

检查输入文本中是否包含「全角空格」(Unicode U+3000)或「制表符」(\t)。本工具默认处理半角空格(U+0020),全角空格和制表符不会被移除。如果需要处理全角空格,请先在全角/半角转换工具中转为半角空格后再处理。制表符可以用文本编辑器的替换功能替换为空格。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

选择 打开 +新窗口 esc关闭