Sublime正则需同时满足开对开关、写对语法、锁住范围:^$匹配空行失败常因BOM或隐形字符;$1原样输出因查找用\1、替换须用$1且开关独立;跨行必须用(?s)或[sS]*?。

Sublime 的正则表达式不是“写对就能用”,而是“开对开关 + 写对语法 + 锁住范围”三者缺一不可——漏掉任一环节,^$ 就匹配不到空行,$1 就原样输出,.* 就卡死不跨行。
为什么 ^$ 找不到空行,\d+ 总是不命中
根本原因常不在正则本身,而在隐式干扰或边界理解偏差:
-
^$确实能匹配空行,但若文件含 BOM、零宽空格(\u200b)或全角空格(\u3000),它就失效;打开 View → Characters → Show White Space 可暴露这些“隐形字符” -
\d+在中文环境易漏匹配:Sublime 默认用 ASCII 模式判断单词边界,id:123能中,用户ID:123就失效;改用(?u)\d+或[0-9]+更稳 -
.默认不匹配换行符,想跨行抓内容(如多行注释),必须显式加(?s)前缀,或用[sS]*?替代 - 状态栏编码不是
UTF-8时,中文场景下^/$可能因乱码失效;先执行 File → Save with Encoding → UTF-8 with BOM
Ctrl+H 替换里 $1 为啥总输出字面量
这是 Sublime 最高频的翻车点:查找和替换对捕获组的引用语法完全不同,且开关独立:
- 查找框中用
\1引用捕获组;替换框中必须用$1(写成\1或就原样输出两个字符) -
Ctrl+F和Ctrl+H的.*开关互相独立:查找到了,替换框里没点.*,$1就不会被解析 - 要输出字面量
$?写$$;想输出字面量??写\? - 命名捕获组只支持
(?P<name>...)写法,替换时用${name}(注意是花括号,不是尖括号) - 嵌套括号编号按左括号从左到右顺序算:
((\w+))中,外层是$1,内层是$2
跨文件全局搜索(Ctrl+Shift+F)为什么总失效
全局搜索不是“开了正则就自动扫项目”,而是必须手动限定作用域并预览结果:
-
Ctrl+H的「替换全部」只作用于当前文件;改整个项目,必须用Ctrl+Shift+F,否则白忙活 - 先按
Ctrl+Shift+F打开全局面板,务必勾选右下角.*启用正则——这个开关在全局面板里也得单独点 -
Where栏必须显式填路径,例如src/**/*.js或!node_modules, !dist;留空只搜当前文件夹 - 执行前务必点
Find预览匹配列表,确认每条路径都合理;Replace All没撤回键,误操作只能靠 Git 恢复 - 大文件(>10MB)建议先人工筛选范围:
Ctrl+Shift+P → Restrict Find to Selection,再开正则
性能卡死或假死?大概率是回溯爆炸
Sublime 用的是回溯正则引擎,没有超时机制,以下写法极易卡住:
-
.*if.*else.*这类松散长匹配,在千行代码里会指数级回溯 -
(a+)+或.*?x.*?y嵌套惰性量词,尤其跨行时风险极高 - 对策:用否定字符集替代
.*,比如func\([^)]+\)比func\(.*?\)更安全 - 加锚定提升效率:
^\s*function\s+\w+比function.*{快得多 - 关掉 Highlight matches 和 Auto expand selection(菜单 → Find),能显著缓解卡顿
真正麻烦的从来不是怎么写正则,而是你不知道 .* 按钮没点亮,或者没意识到 $1 和 \1 在查找与替换中是两套规则——这两个点踩中一个,后面所有正则都白写。

















