^\s* 是对齐替换的起点,因其能匹配行首任意空白(含零个),避免漏掉制表符或误吞注释前空格,确保后续缩进提取准确。

为什么 ^\s* 是对齐替换的起点
未对齐代码的根源通常是行首空格/制表符数量不一致,比如缩进混用 4个空格 和 \t,或同一层级缩进数忽多忽少。Sublime 的正则替换必须先精准捕获“当前行真正的缩进量”,否则后续对齐会错位。直接写 ^ + 会漏掉制表符,^\s+ 又可能吞掉行首注释前的空格(如 # foo),所以稳妥做法是用 ^\s* —— 它匹配行首任意空白(包括零个),再结合后续分组提取有效缩进部分。
用 (\s*)(\S) 提取原始缩进并保留非空白首字符
这个模式能安全分离“缩进”和“内容”,避免误删注释或空行。匹配后,$1 是原始缩进,$2 是第一个非空白字符(如 def 的 d 或 if 的 i)。替换时可统一重置缩进,例如替换成 $2(4空格 + 原字符),就能强制所有顶层语句左对齐到4空格。注意:不能用 ^(\s+)(\S),否则空行或纯注释行(如 # comment)会不匹配,导致漏处理。
- 常见错误:用
^ +(.*)替换为$1—— 制表符不匹配,且会破坏以空格开头的字符串字面量 - Python 场景下,若需按 PEP 8 对齐冒号(
:),得额外加一列捕获,如^(\s*)(\w+\s*:)(.*)$,再按列宽对齐 - 性能影响小,但文件超大(>10MB)时建议先选中目标区域再替换,避免全文件扫描卡顿
\t 和空格混用时,先用 \t → 统一再对齐
Sublime 默认把 \t 渲染为 4 列,但实际存储仍是制表符。如果直接对齐,\t 和 在视觉上可能错位(尤其终端显示 tab width ≠ 4 时)。必须先做一次预处理:查找 \t,替换为 (4空格),再执行缩进对齐。这步不可跳过,否则看似对齐的代码在其他编辑器里会散开。
- 命令:Find →
\t,Replace →(手动敲4个空格,别用\x20{4},Sublime 不支持这种语法) - 确认文档编码是 UTF-8,否则某些特殊空格字符(如
\u00A0)会导致正则失效 - 批量处理多个文件时,用
Find in Files搜索^[^\S\n]*\t(行首含制表符),确保没漏掉隐藏的 tab
对齐多级嵌套结构要分步,别指望一个正则全搞定
函数体、循环块、条件分支的缩进层级不同,强行用单个正则拉平会破坏语法结构。正确做法是分层处理:先对齐顶层(如 def、class、if),再选中其内部代码块,用相同逻辑对齐下一层(如 for 内部的 print())。Sublime 支持多行选择(Ctrl+Click 或 Ctrl+Shift+L),选中后只在选区运行替换,避免跨层级干扰。
- 容易踩的坑:对 Python 用
^( {4})*(\S)匹配“4的倍数空格”,但实际缩进可能是 2/6/8,硬套会切掉合法缩进 - JavaScript 中对象字面量的键值对对齐(如
key: val)需单独处理,用(\s*[^:\n]+):\s*(.+)捕获再格式化,和缩进正则无关 - 正则无法判断语法合法性,替换后务必运行
python -m py_compile或 ESLint 验证,防止空格误删导致缩进错误
真正难的不是写出正则,而是判断哪几行该归为同一逻辑块——这得靠人眼识别语义,工具只负责执行。

















