sublime text 默认不支持跨行正则搜索,需启用 (?s) 模式;where 路径错误或正则开关未点亮会导致失败;替换时 $1 仅在查找与替换框均启用正则时生效。

Sublime Text 默认不支持多行文本搜索,必须显式启用跨行模式,否则 .*、^、$ 等行为全部失效。
为什么 foo.*bar 总是搜不到换行内容?
Sublime 的正则引擎(Boost.Regex)默认将 . 视为“除换行符外的任意字符”,^ 和 $ 也只匹配每行首尾,而非整个文件起止。这不是 Bug,是设计如此。
- 直接写
foo.*bar→ 只能匹配同一行内的foo和bar - 想跨行匹配?必须加
(?s)前缀:(?s)foo.*bar - 要匹配从
function render(到对应}的整个函数块?用(?s)function render$$.*?$$,记得转义括号:$$和$$ - 若还配合
^或$定位行首/尾,需改用\A(文件开头)、\Z(文件结尾)
Where 路径填错会让跨行搜索彻底失效
即使正则写对,Where 字段填错也会导致目标文件根本没被扫描——跨行搜索就无从谈起。
- 填
src/→ 只扫src/下所有层级的文件(含子目录),但不会扫tests/或根目录下的index.js - 填
.(单个英文点)→ 扫整个项目目录,这是最常用且安全的写法 - 填
*, -node_modules/, -dist/→ 风险极高:*会触发全盘扫描(包括挂载的网络盘、外部 USB),极易卡死;应避免 - 填
src/**/*.js, tests/**/*.js→ 显式限定类型和路径,推荐用于 JS 重构场景
替换时 $1 不生效?两个 .* 开关都要点蓝
查找框和替换框的正则开关是独立的。跨行搜索常伴随捕获组替换,漏点一个,$1 就变成字面字符串。
- 查找框里写
(?s)"name": "(.*?)",→ 必须点查找面板右下角的.*图标,变蓝才算启用 - 替换框里写
"name": $1→ 替换面板的.*图标也必须是蓝色,否则输出就是原样$1 - 快捷键
Alt+R(Win/Linux)或Cmd+Alt+R(macOS)可切换当前面板的正则状态,但不能跨面板同步 - 别用
\1—— Sublime 只认$1,\1是字面量
删空行、去尾空格这些“小操作”最容易破坏结构
跨行场景下,\s 的行为尤其危险:它在 Sublime 中会匹配 \r 和 \n,一不留神就吞掉换行符。
- 删纯空行?用
^[ \t]*$,不是^\s*$—— 后者可能误删只有\r的行,破坏 Windows 行尾兼容性 - 删行尾空格?用
[ \t]+$,不是\s+$—— 后者可能吃掉最后一行的\n,保存后整个文件少一行 - 替换框留空即可删除匹配内容;别手动加
\n或\r,Sublime 自动保持原有行边界 - 执行前务必点
Find All,确认底部面板列出的是你预期的所有匹配项;跳过这步,Replace All in Files可能只作用于当前视口可见的几条
真正麻烦的从来不是正则怎么写,而是你有没有三秒时间看一眼 .* 图标颜色、扫一遍 Where 路径、点一下 Find All 预览——这三步跳过,后面 Git revert 的时间够重写两遍逻辑。











