应分两步操作:先用s+$删行尾空格,再用^s+删行首空格;若需避开换行符干扰,可改用^[ ]+|[ ]+$替代。

匹配行首行尾空格并删除
Sublime 的正则替换能一次性干掉行首 ^\s+ 和行尾 \s+$ 的空格,但别直接写成 ^\s+|\s+$ —— 这样在「替换为」留空时,会把空行变成单个换行符(因为 \s+ 匹配了换行符本身)。更稳的做法是分两步:先删行尾,再删行首,或者用 ^[ \t]+|[ \t]+$(显式列出空格和制表符,避开 \s 对换行符的捕获)。
保留缩进但删掉行内多余空格
想留着 Python 或 JSON 的缩进结构,只压缩连续空格为单个空格?用 [ ]{2,} 替换为 (一个空格)。注意别用 +,它会把缩进里的单个空格也卷进去;也别开「. 匹配换行符」选项,否则 会跨行合并。常见误操作是写成 \s{2,},结果把缩进里的 \t 也替掉了,Python 代码直接报 IndentationError: unindent does not match any outer indentation level。
清理注释里的空格但不动代码逻辑
比如 // hello world 想变成 // hello world,但不能动 int x = 1; // comment 里代码部分的空格。这时得靠「负向先行断言」:(? 不够稳,推荐更直白的分步法:先选中所有注释行(<code>//.*),再在选区里用 //\s* → // ,接着对选区用 \s+$ → 空。关键点:Sublime 的「在选区中替换」必须手动勾选,不勾就全局扫,容易误伤。
避免破坏字符串字面量里的空格
像 console.log(" hello "); 这种,不能把引号里的空格也删了。纯正则很难 100% 安全识别字符串边界,尤其遇到转义引号 "say "hi" "。务实做法是:先用 "([^"\\]|\\.)*" 或 '([^'\\]|\\.)*' 把字符串全选中(Sublime 支持 PCRE 风格的非贪婪匹配),然后 反选(Ctrl+Shift+I),再对非字符串区域执行空格清理。这步漏掉反选,就等于主动给代码埋 bug。
真正麻烦的不是正则写法,而是 Sublime 默认关闭「正则模式」和「区分大小写」——这两个开关藏在查找面板右下角,图标不起眼,手一滑就忽略,结果试十次都看不到效果。

















