VSCode删除空行需用正则^\s(?=\r?\n)并启用多行模式,因^\s$无法匹配换行符且\s在Windows下可能误吞\r;需注意Unicode空格、换行符混用及大文件性能问题。

VSCode 本身没有“删除空行”的原生命令,但用正则替换就能精准干掉,关键不是写对正则,而是理解它匹配的是什么、不匹配什么。
为什么 ^\s*$ 替换为空会失效或误删
直接搜 ^\s*$ 并替换为空,视觉上空行还在——因为 \s 不匹配换行符本身,替换后只是清空了行内容,\n 还在;更糟的是,在 Windows 下 \s 可能意外吞掉 \r,导致换行错乱。
- 必须把换行符显式纳入匹配范围,否则永远删不干净
-
^和$默认只匹配整个文档首尾,不是每行——得启用多行模式(\n按钮) -
\s在部分场景会匹配\r或\n,造成跨行吃掉内容
最稳的正则:用 ^\s*(?=\r?\n) 配合多行模式
这个写法只匹配「以空白字符开头、后面紧跟着换行符」的行,跳过文件末尾那行(即使为空),避免误删最后一行语义。
- 打开搜索面板(
Ctrl+H/Cmd+H) - 查找框填:
^\s*(?=\r?\n) - 替换框留空
- 务必勾选右下角的
.*(正则)和\n(多行模式) - 点「全部替换」
处理 Unicode 空格和不可见字符
有些“空行”看着空,其实含 \u00A0(不间断空格)或 \u200B(零宽空格),\s 默认不认它们。
- 若发现某行删不掉,把光标放那行开头,按
Ctrl+Shift+P→Developer: Toggle Developer Tools,在 Console 里执行:document.activeElement.value.split('\n')[N].length(N 是行号)看真实字符数 - 需要兼容时,把正则换成:
^[ \t\u00A0\u200B]*(?=\r?\n) - 混用 CRLF 和 LF 的文件,建议先统一换行符:
Ctrl+Shift+P→Change End of Line Sequence
批量删多个文件时容易漏掉的坑
用 Ctrl+Shift+H 全局替换看起来方便,但实际匹配受编码和语言模式影响很大。
- UTF-8 with BOM 文件开头有
\uFEFF,^\s*无法匹配,得前置处理或换正则 - 某些语言模式(如
plaintext)下\s行为可能不同,确认右下角显示的语言 ID 正确(比如是javascript而非plain text) - 大文件(>5MB)慎用「全部替换」,卡顿或漏匹配很常见,优先试单步替换 + 预览
真正难的从来不是写哪条正则,而是你根本不知道那一行到底是不是真的“空”——有时候删不掉,不是正则错了,是它根本不是空行。


















