^\s+ 是唯一靠谱的写法,因其用 ^ 锁定行首、\s+ 匹配一个及以上空白字符,避免零长度匹配和跨行问题,而其他写法存在空行、语法错误或逻辑偏差等硬伤。

直接删行首空格,用 ^\s+ 正则替换最稳;但必须勾选 .* 模式、且只对选中区域操作——全文替换会破坏注释缩进、YAML 对齐、Python docstring 等依赖空白的结构。
为什么 ^\s+ 是唯一靠谱的写法
^\s+ 能精准咬住每行开头的一个及以上空白字符(含空格、\t),关键在两个锚点:^ 锁定行首,\s+ 避免零长度匹配。其他常见写法都有硬伤:
-
\s*:会匹配零长度,导致“Replace All”后插入大量空行 -
^s+(少反斜杠):Sublime 不识别,查无结果 -
trim_auto_indent:名字像,实际是重排缩进逻辑,不是清空行首
操作时三个必踩的坑
失败通常不在正则本身,而在面板设置和作用范围:
- 右下角
.*按钮必须点亮,否则^\s+当纯文本处理,完全不生效 - 千万别全选全文后点
Replace All:注释行、JSON 字符串缩进、Python 的"""块都会被扫荡 - 想只处理某段?先鼠标拖选,或按
Ctrl+L逐行选中目标行,再开替换面板——此时^\s+只在选区内起效
删完缩进错乱?大概率是 Tab/空格混用
行首空格被删后,如果代码块整体左移、Alignment 插件对不齐、甚至 Python 报 IndentationError,基本可断定原文件混用了 Tab 和空格:
- 菜单
View → Indentation → Convert Indentation to Spaces,把所有Tab强制转为空格 - 顺手关掉
Indentation → Detect Indentation,避免下次打开又自动切回Tab
这步做完再删行首空格,后续所有对齐、折叠、跳转行为才可靠。
想同时删行首 + 行尾空格?顺序不能反
两步必须严格按顺序执行:
- 第一步:查找
^\s+,替换为空 → 干掉所有行首空白 - 第二步:查找
\s+$,替换为空 → 再干掉所有行尾空白
如果反过来,某些原本只有空格的行(比如纯空行或缩进行)会在第二步变为空,再执行第一步时就被整行清空。想一步到位可用 ^\s+|\s+$,但依然建议分两次操作更可控——毕竟 Sublime 的 Replace All 不会自动跳过已修改过的行。
真正容易被忽略的是:正则里的 ^ 和 $ 默认以换行符为界,但一旦误开右下角的 \n(即 . matches newline),.* 就能吞掉换行符,导致跨行匹配失控。











