sublime text支持pcre正则,可跨行、用捕获组、条件替换,实现key格式转换;关键需锚定上下文(如t(后字符串)、分步提取与重组、用负向断言排除动态拼接,并通过find all预演确保安全。

为什么 find 和 replace 里写对正则就能批量改 key?
因为 Sublime Text 的查找替换引擎支持 PCRE 风格正则,且能跨行、带捕获组、支持条件替换——国际化 key 清洗本质就是「识别旧格式 → 提取语义片段 → 按新规则拼接」,这恰好是正则最擅长的模式转换。
常见错误是直接用模糊匹配(比如 .*error.*)替换,结果误伤字符串值或注释;真正安全的做法是锚定上下文,比如只匹配 t( 或 gettext( 后面紧跟的字符串字面量。
- 确保启用
Regular Expression模式(Alt+R / ⌘+R) - 勾选
Match Case避免把Button和button混为一谈 - 用
G或^+ 行首缩进控制作用范围,防止跨函数污染
如何从 t('user.login.submit') 提取并转成 user_login_submit?
关键在分两步:先用查找定位原始 key 字符串,再用替换按规则重组。不能一步到位,否则无法处理引号类型不一致(' / " / `)或内部含转义的问题。
查找正则:
ts*(s*(['"`])((?:[^\]|\.)*?)s*)解释:
['"`] 匹配任意引号类型,(?:[^\]|\.)*? 非贪婪匹配内容(支持 ' 这类转义), 确保前后引号一致。
替换为:
t('$2'.replace(/./g, '_'))
⚠️ 注意:这不是 JS 执行,只是文本替换。所以实际填的是:t('$2') → 先提取原始值,再另开一次替换把 . 换成 _。
- 第一次替换目标设为
$2,得到纯 key 字符串(如user.login.submit) - 第二次对新插入的 key 执行
Find: .→Replace: _,即可批量转下划线 - 若需保留大小写(如
userLoginSubmit),得用更复杂的正则,但 Sublime 不支持回调函数,建议导出后用脚本处理
遇到嵌套引号或模板字符串怎么避免炸掉?
比如 t(`user.${role}.delete`) 或 t("error: " + msg),这类不是静态 key,硬套正则会错提、截断甚至删掉变量部分。
稳妥做法是加前置断言,排除含 $、+、+、concat、join 的行:
^(?!.*(?:$|+|concat|join)).*ts*(s*(['"`])((?:[^\]|\.)*?)s*)
这个正则开头的 ^(?!.*...) 是负向先行断言,能跳过明显动态拼接的行。
- 测试时先用
Find All(Ctrl+Shift+G / ⌘+Shift+G)看命中的是否全是静态字符串 - 如果项目混用
i18n.t()、useTranslation、Trans组件,得分别写三套正则,不能指望一个通吃 - Sublime 对超长行(>10k 字符)的正则性能会骤降,建议先折叠无关代码块再操作
重构后 key 重复或缺失怎么快速验?
正则不会帮你查重,它只负责改文本。改完必须立刻验证:key 是否真实存在对应翻译项、有没有因大小写/下划线差异导致漏匹配。
推荐两个轻量手段:
- 用 Sublime 的
Find in Files(Ctrl+Shift+F / ⌘+Shift+F)搜新 key 格式,确认所有源码已更新,没残留旧 key - 把所有新 key 复制进翻译文件目录,用命令行跑
grep -oE '[a-z_]+.[a-z_]+' zh.json | sort | uniq -d快速揪出重复定义 - 如果项目用
eslint-plugin-i18n,改完立即npm run lint,它会报出未声明的 key —— 这比肉眼扫快得多
最容易被忽略的是组件内联 key 属性(如 <button i18nkey="common.cancel"></button>),这类不在 t() 调用里,得单独写正则扫 i18nKey= 或 data-i18n=。











