Sublime正则替换i18n文件需严格区分键、值、注释边界:JSON用^s"([a-zA-Z0-9_]+)"s:s("1"|d+|true|false|null),properties用^([a-zA-Z0-9_.]+)s=s(.)$,YAML分三种引号格式捕获;加前缀须用负向断言^(?!(en_|zh_|...))[a-zA-Z0-9_]+(?=:s["'{[ ]);提取中文应先捕获完整字符串再筛选;跨行处理需单独启用“.matches newline”且勿与行级匹配混用;每次替换前必用Find All验证高亮精准性。" ↩

Sublime 的正则替换能高效处理 i18n 多语言文件(如 JSON、properties、YAML),但直接套用通用正则极易误删键名、破坏嵌套结构或漏掉带空格/转义的值——关键在区分「键」「值」「注释」三类边界,并规避跨行陷阱。
匹配键值对时必须锚定行首+分隔符,别信^.*key.*$
多语言文件常混有注释、空行、缩进,^.*label.*$ 会误中 // label: xxx 或 "label_en": "xxx"。正确做法是明确语法边界:
- JSON:
^s*"([a-zA-Z0-9_]+)"s*:s*("[^"]*"|d+|true|false|null)—— 捕获键名到$1,字符串值到$2,避开注释和嵌套对象 - properties:
^([a-zA-Z0-9_.]+)s*=s*(.*)$—— 注意=后可能有空格,$2包含整行值(含空格) - YAML:
^(s*[a-zA-Z0-9_]+)s*:s*(?:"([^"]*)"|'([^']*)'|([^# ]*))—— 分别捕获双引号、单引号、无引号三种值格式,$2/$3/$4选其一
批量添加前缀(如 en_)要防重复,用负向先行断言
给所有键加 en_ 前缀时,^([a-zA-Z0-9_]+): 直接替换为 en_$1: 会导致 en_label: 变成 en_en_label:。必须排除已存在前缀的键:
- 查找:
^(?!(?:en_|zh_|ja_|ko_|fr_|de_|es_))[a-zA-Z0-9_]+(?=:s*["'{[]) - 替换:
en_$0($0表示整个匹配,不是$1) - 说明:
(?!...)确保开头不是已有语言前缀;(?=:...)确保后面紧跟冒号和值起始符号,避免匹配到注释里的单词
提取所有中文字符串时,. 不跨行且 u4e00-u9fa5 不够用
[^ -ÿ] 会错吞 emoji 和全角标点;[u4e00-u9fa5] 漏掉繁体、日文汉字、平假名、片假名。更稳的写法是:
- JSON 字符串值内中文:
"([^"\]*(?:\.[^"\]*)*)"先完整捕获字符串(正确处理转义引号),再人工检查或二次筛选 - 实际提取建议:
"((?:[^" \]|\.)*?)"+ 手动 Ctrl+Click 高亮后按Ctrl+L选整行,复制到临时文件再 grep 中文 - 跨行字符串?Sublime 默认不支持,必须勾选右下角
.(. matches newline)或改用"([^ "]*?)"+ 多次执行
全局替换前必须关掉 .matches newline,否则 $ 会失效
在 Ctrl+Shift+F 全局搜索中启用 . matches newline,会导致 $ 错误匹配到换行符前而非行尾,^key:$ 就无法命中 "key": "value" 这种换行格式。正确流程:
- 先关闭
.图标(确保^/$按行工作) - 用
^s*"([a-z_]+)"s*:s*("[^"]*")查找所有键值对 - 替换时用
"en_$1": $2,保留原引号和转义 - 若需跨行处理(如多行字符串),单独开一个文件,勾选
.后再操作,别混用
最易被忽略的是:JSON 中的
、" 是字符串内容,不是换行或引号;正则里写 " 会终止匹配,必须写成 "。任何一次替换前,务必点 Find All 看高亮是否精准圈出目标行——多语言文件容错率极低,错一次就得从 Git 恢复。

















