$1在替换中不生效的三大原因:正则模式未启用(需点.*图标或快捷键alt+r/cmd+alt+r)、括号未转义(如func()、捕获组编号错误(按左括号顺序,(?:)不占位)。

$1 在替换里不生效?八成是正则模式没开、括号没转义、或编号数错了——三者缺一不可。
必须点亮 .* 图标才能启用正则模式
Sublime 查找框默认是纯文本模式,哪怕你写了 (\w+),它也只当字面量 (w+) 匹配。只有右下角的 .* 图标变蓝、状态栏显示 Regex,括号才会被当作捕获组解析。
快捷键更可靠:Windows/Linux 按 Alt+R,macOS 按 Cmd+Alt+R(不是 Cmd+R)。
- 点图标后立刻用
\d+测试:能高亮数字,说明正则已生效;否则重试 - 如果原文含真实括号(比如想匹配
func(x)),查找里得写成func\(和\),否则会被当成捕获组干扰编号 - 替换字段必须用
$1,不能用\1或${1};$0是整个匹配结果,不是第一组——误用会导致空替换或乱码
跨行匹配别硬刚 .*,优先用 [\s\S]*? 或 (?s)
默认 . 不匹配换行符,强行勾选 . matches newline 后,.* 又容易贪婪吞到文件末尾,尤其遇到嵌套结构(如 {{}})时回溯爆炸、卡死界面。
-
[\s\S]*?显式覆盖所有字符,兼容性好,Sublime 解析更可靠 - 也可在正则开头加
(?s)开启 dotall 模式,例如(?s)start(.*?)end - 匹配换行符本身,用
\R(比\r?\n更跨平台),不要用\n字面输入(需Ctrl+Enter插入)
捕获组编号按左括号顺序,(?:) 不占位
Sublime 对捕获组编号完全按左括号出现顺序从左到右排,不管嵌套深度。而 (?:) 是非捕获组,不生成编号——这点极易被忽略,导致实际指向错误内容。
-
(a(b(c)))中:$1 = abc,$2 = bc,$3 = c -
(a(?:b)(c))中:$1 = ac(?:b不占位),$2 = c - 嵌套深时建议先用
Find All验证匹配结果,再看高亮分组边界是否符合预期 - 要输出字面量
$1,得写成$$1;单个$会报错或不匹配
多行提取 + 批量操作的关键组合:^.*pattern.*$ + Ctrl+Shift+L
想批量提取所有含 error 的整行?光靠 error 会只选中单词,而不是整行。必须用锚点确保上下文完整。
- 查:
^.*error.*$→ 点Find All,所有匹配行首被选中 - 按
Ctrl+Shift+L(macOS 为Cmd+Shift+L)扩展为整行选择 - 此时可直接复制、剪切,或再按
Ctrl+Shift+K删除整行 - 若要跨文件提取,用
Ctrl+Shift+F,在Where栏限定路径(如src/**/*.js),避免卷进node_modules
真正卡住人的往往不是正则多难,而是模式没开、括号没转义、编号数错、或跨行时没关掉贪婪——每次替换前,先用 Find 确认命中范围,比直接 Replace All 安全得多。











