^\s*(?=\r?$) 是最稳的批量删空行方式,它精准匹配视觉上为空的行(含任意空白字符但紧随换行符),兼容所有换行格式,且不误删结构所需空行。

直接用 ^\s*(?=\r?$) 替换为空,是目前最稳、最不容易漏删的批量删空行方式。 其他写法比如 ^\n 或 ^\s*$ 在特定场景下会失效,尤其当文件混用换行符或含不可见空白时。
为什么 ^\n 经常删不干净
它只匹配「开头没任何字符,紧接着就是换行符」的行。只要某行有 1 个空格、1 个制表符、甚至 1 个全角空格,^\n 就完全不匹配。
- Git diff 里飘白线、Code Review 被打回,八成是这种“假空行”没清掉
- Windows 下编辑过的文件可能含
\r\n,^\n在部分正则引擎中无法跨平台匹配 - PhpStorm 的
^锚点默认作用于行首,但\n不在行内——它其实是行尾的分隔符,所以^\n实际语义模糊,行为不稳定
^\s*(?=\r?$) 到底在匹配什么
这个正则精准表达「视觉上为空的行」:从行首开始,允许任意数量空白字符(\s),但要求后面紧跟着换行符(\r? 表示可选的回车,$ 锚定行尾),且不消耗换行符本身(靠 (?=\r?$) 这个正向先行断言保证)。
- 能匹配:
(4 个空格)、\t\t(2 个制表符)、(全角空格)、纯\n或\r\n - 不误删:
<!-- -->、<div></div>中间那行(哪怕它只有空白,也属于标签结构的一部分,但此正则仍会匹配;若需保留,得加负向断言,见下条) - 兼容所有换行格式:Linux/macOS 的
\n、Windows 的\r\n,无需提前统一
批量操作前必须关掉 EditorConfig 支持
只要项目根目录存在 .editorconfig 文件,且 PhpStorm 的 Enable EditorConfig support 是开启状态,你用正则删掉的空行,下次保存时可能被它强行加回来——因为 trim_trailing_whitespace = true 或 insert_final_newline = true 等规则会悄悄干预。
- 路径:
Settings > Editor > Code Style > Enable EditorConfig support(取消勾选) - 点
Apply后立刻试一次^\s*(?=\r?$),确认空行真的消失 - 如果团队强制启用
.editorconfig,就别依赖正则批量删,改用「保存时自动清理」组合策略:Strip trailing spaces on Save+Keep maximum blank lines = 1
替换操作本身要小心
不是所有「空行」都该删——比如 PHP 文件中函数之间、类方法之间的空行,有语义分隔作用;HTML 中 和 之间多一行,不影响渲染但影响可读性。
- 先对单个文件试,别一上来就
Replace All整个项目 - 按
Ctrl+Z可撤回,但批量后 diff 量大,建议操作前先git commit或打快照 - 如果想跳过注释行(如
//或/* */包裹的空行),需改用更复杂的正则,例如:^(?!(?:\s*//|\s*/\*)).*(?=\r?$)——但这容易误伤,不如手动预览
真正麻烦的不是正则怎么写,而是「什么时候该删、删多少、谁来决定」——空行不是 bug,是风格约定。团队没对齐规范前,再稳的正则也救不了 Code Review 里的红叉。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










