sublime text正则替换需分场景:极简用空格/whole word,极繁必用捕获组+$1+多行模式;\b因引擎限制不可靠,应改用显式边界或空格+whole word;ctrl+shift+f正则开关独立,跨行需勾选match line breaks;未save all则改动不落盘。

Sublime Text 的正则替换不是“开了 .* 就能乱写”,而是必须分清场景:极简替换(比如改个变量名)靠空格和边界控制就足够;极繁替换(比如重写 import 语句、提取 JSON 字段)必须用捕获组 + $1 引用 + 多行模式,否则会漏匹配或炸掉结构。
为什么 \b 在 Sublime 里不能当“单词边界”用
Sublime 的 \b 把下划线 _ 和数字都算作“单词字符”,所以 \buser_name\b 会错误命中 username 或 __user_name。这不是 bug,是 Boost 正则引擎的默认行为。
- 稳妥替代方案:
(? —— 显式声明左右必须是非 ID 字符或行首/尾 - 更轻量做法:在
Find框里直接写user_name(前后加空格),再勾选Whole Word,适合 JS/TS 变量上下文干净的场景 - 千万别信预览列表里“看起来都对”——点开每个匹配项,手动确认前后字符,尤其注意引号、括号、冒号后的位置
Ctrl+Shift+F 面板里正则开关是独立的,不继承 Ctrl+H 状态
你在单文件替换面板 Ctrl+H 里点了 .* 图标,不代表 Ctrl+Shift+F 面板也开了正则。两个面板的正则开关互不影响,必须各自点开。
- 激活方式二选一:
Alt+R(Windows/Linux)或Cmd+Alt+R(macOS),比找图标更快 - 没开正则时,
^、$、\d+全部按字面意思匹配——^import就真的只找开头是^import这 7 个字符的行 - 多行匹配(比如跨行抓
import块)必须额外点Match line breaks按钮(↵ 图标),否则.不匹配换行符
捕获组 + $1 引用是极繁替换唯一靠谱路径
想把 import { a, b } from 'x' 改成 import a from 'x'; import b from 'x';?不用正则捕获组,纯靠字符串替换根本做不到。必须分步:先匹配结构,再用 $1、$2 拆解并重组。
- 查找:
import \{ ([^}]+) \} from '([^']+)' - 替换:
import $1 from '$2'; - 注意:
$1是第一个()里的内容,不是\1(Sublime 用美元符号引用,不是反斜杠) - 如果要保留原始缩进,得在查找里捕获前导空白:
^(\s*)import \{ ([^}]+) \} from '([^']+)',替换用$1import $2 from '$3';
替换完不 Save All,等于什么都没做
点击 Replace All 后,所有被改的文件标签页右上角出现星号 *,这是 Sublime 在提醒你:“我只改了内存,还没写磁盘”。关掉窗口前没点 File → Save All(或 Ctrl+K → Ctrl+B / Cmd+K → Cmd+B),改动彻底丢失,且无撤销历史可恢复。
最容易被忽略的是:Git diff 看不到未保存的改动,运行测试也不会反映新逻辑——你以为重构完成了,其实连第一行都没落盘。











