真正起效的空行匹配正则是^\s*\r?\n,兼容LF与CRLF;需注意BOM、零宽字符、全角空格等伪空行,并配合文件编码、换行符统一及末尾换行符规范处理。

VSCode正则匹配空行必须带换行符
只写 ^$ 或 ^\s*$ 会漏掉绝大多数“看起来是空”的行。因为真实空行在文件里是「空白内容 + 换行符」,而 ^\s*$ 只匹配到换行符之前的部分,替换后换行符还在,视觉上仍是空行。
真正起效的是把换行符也纳入匹配范围:
-
^\s*\r?\n✅ 兼容 LF(\n)和 CRLF(\r\n),适合混合换行符项目 -
^\s*$\n✅ 在 VSCode 的 JavaScript 正则引擎下稳定工作,\s包含\t、\r、\n、\f、\v - 别用
^\n❌ 它试图匹配“行首就是换行符”,但换行符实际在行尾,几乎不命中
过滤含不可见空白字符的“伪空行”
全角空格、\u200B(零宽空格)、\uFEFF(BOM)这些字符肉眼不可见,但会让 ^\s*$ 失效——因为 \s 默认不包含它们。
若发现某些空行怎么都删不掉,先打开「显示空白字符」(Ctrl+Shift+P → 输入 Toggle Render Whitespace),再针对性处理:
- 查 BOM 开头:
^\uFEFF\s*$\n,替换为空(适用于 UTF-8 with BOM 文件) - 查零宽控制符:
[\u202a-\u202e\u2066-\u2069],替换留空(覆盖 LRE、RLE、PDI 等) - 全角空格单独处理:
(中文全角空格 Unicode 是\u3000),可加进\s扩展:[\s\u3000]*$
全局搜索时避免跨文件误伤
用 Ctrl+Shift+H 批量处理多个文件,容易因编码或换行符不一致导致漏匹配或错删:
- UTF-8 with BOM 的文件,首行可能不被
^\s*$\n匹配,需提前统一为 UTF-8(无 BOM) - 混用 LF 和 CRLF 的项目,
\n在 CRLF 文件中只能匹配到\r后半部分,建议先右下角点击换行符标识,统一为 LF 或 CRLF 再操作 - 务必点「Preview」按钮,逐个检查高亮项——尤其关注文件开头、JSON 字符串内部、正则字面量、注释边缘
- 如果某类文件(如
.env或.md)不该清理空行,搜索时在「files to include」框里排除:!**/.env,**/*.md
删空行后文件末尾只剩一个换行符
用 ^\s*\r?\n 全部替换后,文件末尾可能完全没换行符,或残留多个。Git 推荐文件以单个换行符结尾,这时要分两步:
- 先删所有空行:
^\s*\r?\n→ 空 - 再确保末尾只有一个换行符:
\n{2,}$→\n(注意末尾锚点$,只作用于文件尾) - 更稳妥的做法是开启两个设置:
"files.trimTrailingWhitespace": true+"files.insertFinalNewline": true,保存时自动补足且不允许多余
空行本身没语义,但删得不干净会干扰 Git diff、CI lint 检查,甚至让某些语言解析器报错——重点不是“有没有空行”,而是“空行是否可控、可预期”。


















