sublime text正则替换需用pcre引擎,注意\r匹配换行、\k重置起点、$1引用捕获组、关闭highlight避免卡顿,并用find in files实现跨文件替换。

Sublime Text 的查找替换正则功能本身不难,但真正卡住人的从来不是语法,而是「为什么写对了却没匹配上」——多半是引擎选错、换行符没处理、或贪婪模式吃多了。
确认用的是 PCRE 引擎(不是 Python 或 JavaScript)
Sublime Text 默认使用 PCRE(Perl Compatible Regular Expressions),不是 Python 的 re 模块,也不是浏览器的 RegExp。这意味着:
-
\K可用(重置匹配起点,比捕获组更干净) -
(?i)、(?-i)可开关忽略大小写,且作用范围精确到分组 -
\R能跨平台匹配任意换行符(\r\n、\n、\r),比写\r?\n更可靠 - 不支持
(?P<name>...)</name>这种命名捕获(会报错Invalid group reference)
批量删空行或连续空白行要小心 \n 和 \R
想把文件里所有空行(含只有空格/tab 的行)干掉?直接写 ^\s*$ 并勾选 . matches newline 是错的——它会让 ^ 和 $ 失效于多行上下文。
- 正确做法:关闭
. matches newline,用^\s*$\R?替换为(空) - 如果想只删「纯空行」(不含空格),用
^\R,再勾选matches newline也没用——必须关掉,否则^会匹配到行首+换行符中间 - 替换后可能多出一个末尾换行,可追加一次
\R$→清理
捕获组编号和 $1/$2 的坑
Sublime 里反向引用只认 $1、$2,不支持 \1(会字面替换为字符串 \1);嵌套括号按左括号出现顺序编号,不是按最外层。
- 例如:
(a(b(c)))中,$1 = abc,$2 = bc,$3 = c - 非捕获组
(?:...)不占编号,可用来组织逻辑又不干扰 $N - 如果用了
\K,前面内容不进入匹配结果,也就无法被$1引用——适合「找前缀但不替换成」的场景,比如把log.info(后面所有内容提取出来:用log\.info\(\K.*?(?=\))
大文件里用正则替换卡死?先关掉实时预览
Sublime 在「Find in Files」或大文件中启用正则时,如果开启 Highlight matches 或 Auto expand selection,会边扫描边高亮,极易假死。
- 临时提速:菜单 →
Find→ 取消勾选Highlight matches和Auto expand selection - 避免全文匹配爆炸:不用
.*开头,改用[^"]*等否定字符类限定范围 - 真要处理万行以上 JS/JSON,建议先导出匹配行(
Find All→Copy All),再另开窗口操作
最常被忽略的一点:Sublime 的「Replace All」默认只作用于当前光标所在视图(哪怕你开了多个标签页),不会跨文件批量改——真要多文件操作,必须用 Find in Files(Ctrl+Shift+F),且路径填对,否则白忙活。











