Sublime正则需三步:先点亮.*图标启用模式,再开“. matches newline”支持跨行,最后用[ \t]*等精确字符类避免误匹配换行符;否则\d+等均作字面量处理。

Sublime 的正则不是“开了就能用”,很多看似正确的表达式在实际操作中会漏匹配、多匹配,甚至破坏文件结构——核心问题往往出在模式没开、边界没控、字符类选错这三个地方。
必须点亮 .* 图标,否则所有元字符都当字面量处理
这是最常被跳过的一步:Ctrl+F 或 Ctrl+H 打开面板后,.* 图标默认是灰色的。此时输入 \d+、console\.log\(.*?\) 或 ^$,Sublime 一律按纯文本查找,根本不会解析任何正则语法。
- 快捷键是
Alt+R(Windows/Linux)或Cmd+Option+R(macOS),按一次就切换状态 - 图标变蓝才算生效;关掉面板再打开,要重新点一次,不记忆上次状态
-
Ctrl+Shift+F全局搜索也一样——不点.*,log\(.*?\)就只搜字面字符串log(.*?)
跨行匹配必须显式启用 . matches newline
. 默认不匹配换行符,所以 /\*\*.*\*/ 永远匹配不了多行 JSDoc 注释。想让它跨行,不能只靠 [\s\S] 替代(虽然可行),更直接的是开启引擎级支持:
- 在已启用正则模式(
.*图标为蓝)的前提下,再点击右下角的.matches newline 选项(或按Alt+R两次) - 开启后,
.就真能匹配包括\n在内的所有字符,.*?才具备跨行非贪婪能力 - 未开启时硬写
[\s\S]*?虽可绕过,但可读性差,且在复杂嵌套场景下容易和\s的换行吞并行为冲突
删空行、去尾空格,别用 \s
\s 在 Sublime 中会匹配 \n 和 \r,这会导致两个严重后果:
- 用
^\s*$删空行,可能把只有\r的“假空行”误删,或把文件末尾的换行符吃掉,保存后少一行 - 用
\s+$去尾空格,同样可能吞掉行尾换行符,导致后续行被合并 - 正确做法是显式限定:
^[ \t]*$(删真正空行)、[ \t]+$(删行尾空格/Tab)
提取括号内容,[^)]+ 比 .*? 更安全
想从 getUserInfo(id, callback) 中提取参数,用 \((.*?)\) 看似简单,但一旦遇到换行、注释或嵌套调用(如 fn(getUser())),.*? 就会越界匹配到外层括号闭合处。
-
\(([^)]+)\)明确表示“左括号后,匹配一个或多个非右括号字符”,天然防嵌套破界 - 它不依赖非贪婪修饰符,也不受换行影响(只要没开
.matches newline,.本就不跨行;开了也没关系,[^)]依然拒绝)) - 若需支持嵌套(如
fn(a(b))),Sublime 的 PCRE 引擎不支持递归语法,得拆成多步或改用外部工具
真正容易被忽略的不是语法多难,而是每次操作前那三秒:确认 .* 图标是否点亮、预览高亮是否符合预期、Where 路径有没有写成 *。这些动作不花时间,但跳过一次,就得翻 Git 日志补救。


















