Sublime Text 的 snippet content 区域不支持正则,仅 transform 字段支持 PCRE 正则替换,需双反斜杠转义且依赖 $TM_SELECTED_TEXT 等变量;复杂逻辑应改用插件。

Sublime Text 的正则代码片段(snippet)本身不支持运行时正则匹配或动态捕获——它只是静态文本模板,所谓“正则 snippet”其实是靠 transform + regex 在 .sublime-snippet 文件里做变量预处理,不是在触发时执行 JS 那种正则。
为什么 regex 只能在 transform 里用,不能写在 content 中
Sublime 的 snippet 引擎不解析 content 区域里的正则语法;它只把那里当纯文本插入。真正能触发正则替换的,只有 transform 字段,且必须配合 $TM_SELECTED_TEXT 或其他变量使用。
-
transform是唯一支持regex、replace、escape的上下文,格式为:{"regex": "pattern", "replace": "replacement"} - 直接在
content里写$1或word不会生效,只会原样输出 - 如果你看到别人“用正则写 snippet”,大概率是他们把正则逻辑塞进了
transform,然后用$SELECTION当输入源
transform 的正则参数怎么写才不报错
Sublime 使用的是 PCRE(Perl 兼容正则),但有严格限制:不能跨行、不支持 (?x) 注释模式、转义要双反斜杠(因为 JSON 字符串需先被解析一次)。
- 匹配中文或空格?写成
"regex": "(\\S+)"(注意四个反斜杠:JSON 里两个 → 正则里一个) - 想把选中的
foo.bar.baz转成FOO_BAR_BAZ?{"regex": "(\w+)\.(\w+)\.(\w+)", "replace": "$1_$2_$3"}→ 再套个upper变量:$1:$2:$3后接upper不行,得用两次transform或改用插件 - 常见错误:
"regex": "if"会失败——必须写成"regex": "\bif\b",否则 JSON 解析阶段就丢掉反斜杠
替代方案:什么时候该放弃 transform,改用插件或命令
当你需要条件判断、多步替换、或基于光标位置动态生成内容时,transform 就力不从心了。它没法读取当前文件名、无法判断是否在字符串内、也不能嵌套调用。
- 简单批量重命名变量?用
transform还行 - 想把 Python 的
def my_func()自动转成测试函数名test_my_func并插入新行?transform做不到,得用sublime_plugin.TextCommand - 依赖外部工具(如
jq格式化 JSON)?必须走exec命令或Terminus插件,snippet 无权调用 shell - 社区常用补救:装
ApplySyntax+RegReplace插件,它们提供独立的正则操作面板,比硬塞进 snippet 稳定得多
真正难的不是写对正则表达式,而是搞清 Sublime 哪一层在解析它——编辑器、JSON 解析器、PCRE 引擎,三层转义叠在一起,少一个反斜杠就静默失效。调试时打开 Tools → Developer → Show Console,看有没有 invalid transform 提示,比猜强。

















