因为sublime默认^和$只匹配全文起止而非每行首尾,需启用多行模式:勾选↩按钮或加(?m)修饰符;windows下$停在 前,建议用 替代;跨行需(?s)使.匹配换行符。

为什么 ^ 和 $ 不匹配行首行尾?
因为 Sublime 默认启用多行模式,但 ^ 和 $ 仍只锚定整个文本的开头和结尾,不是每一行。你写 ^import,只会匹配文件最开头那个 import,其他行的 import 完全不中。
解决方法只有两个:要么勾选右下角的 ↩(Match line breaks)按钮,要么在正则开头显式加 (?m) ——比如 (?m)^import。Windows 下还要注意换行符是
,$ 默认停在
前,更稳妥的是用 R(Sublime 内置的通用换行符)替代 $。
. 为什么跨不了行?怎么安全跨?
. 默认不匹配换行符,这是几乎所有正则引擎的默认行为。所以 console.log(.*?) 在多行调用时必然失败——遇到换行就断了。
- 别用
[sS]*?强撑:虽然能工作,但性能差,大文件里容易卡死 - 优先考虑先格式化:用 Prettier 把跨行代码转成单行,再用稳定正则处理
- 真要跨行,必须加
(?s)开头,例如(?s)console.log((.*?)) - 注意:
(?s)只影响.,不影响[^)]这类字符类;如果参数本身含换行,[^)]*依然会截断,得改用(?s)console.log((.*?))并人工确认闭合括号位置
替换时 $1 为啥没生效?
这是新手最高频的“以为正则生效了”的假象。根本原因:查找面板和替换面板的正则开关是独立的。哪怕你在查找框里写了带捕获组的正则、也点了 .*,替换框里的 依然只是两个普通字符——除非你也在替换面板右下角单独点一次 .* 图标。
其他关键细节:
- 必须用
$1,写成或\1都无效 - 要输出真实美元符号,写成
$$,比如cost: $$100 - 查找时用了
fetch(([^)]+)),替换就得写api.fetch($1),少一个括号或错位都会失败
全局替换为何总误伤第三方代码?
Ctrl+Shift+F 时,Where 字段填 * 就等于裸奔。搜 log(.*?) 替成 console.log$1,可能直接改掉 node_modules 里压缩过的代码,甚至把 README.md 里的示例也卷进去。
必须锁定路径:
- 写
src/**/*.js匹配 src 下所有 .js 文件 - 多个路径用英文逗号分隔,不加空格:
src/**.js,tests/**.ts - 执行前务必点 “Find All in Files” 预览列表,确认每条路径都合理
- Replace All 没撤回键,误操作只能靠 Git 恢复
跨行匹配真正难的不是语法,而是边界控制——括号是否闭合、注释块是否嵌套、路径是否锁死。每次操作前花三秒看一眼 .* 图标颜色、预览高亮、扫一眼 Where 路径,比事后翻 Git 日志快得多。











