sublime text正则处理字典文件需锚定结构、分层捕获、验证输出:用^[ ]*([a-za-z_][a-za-z0-9_]*)[ ]*:[ ]*(.+)$匹配键值对,避免.*跨行;去空格引号用":\s*"[ \t]*(.*?)" → ": "$1"等;转json前须清注释、统缩进,最后人工补{}和删末逗号。

Sublime Text 正则替换处理字典文件,核心就一条:别直接上 .*,先锚定结构、再分层捕获、最后验证输出——否则一换全崩,连 key 都对不上。
字典文件里怎么安全匹配 key: value 格式
常见字典格式如 YAML/JSON-like 文本(name: "张三"、age: 25),不能用 ^.*:.*$ 这种粗暴写法,它会跨行吞掉注释或嵌套内容。真正稳的写法要满足三点:行首锚定、冒号后有空格、value 不含换行。
- 推荐查找:
^[ ]*([a-zA-Z_][a-zA-Z0-9_]*)[ ]*:[ ]*(.+)$—— 捕获 key 到$1,value 到$2,[ ]*兼容缩进和空格差异 - 避免用
s:它会匹配换行符,导致跨行误捕;[ ]更精准 - 如果 value 含引号,比如
desc: "hello world",默认正则不跨行,得先勾选. matches newline或改用(?s)前缀 + 显式字符类,但更建议先用「删空行」「统一换行符」预处理 - 测试时务必点
Find All,看高亮是否只圈出有效键值对——若某行没高亮,大概率是缩进不一致或冒号后少了空格
批量清理 value 中的多余空格和引号
字典 value 经常混着 " name "、' id '、甚至无引号裸字符串,手动 trim 不现实。正则能一步标准化,但要注意引号类型和边界。
- 去首尾空格(带双引号):
":s*"[ ]*([^"]*)[ ]*"→ 替换为": "$1" - 同理处理单引号:
":s*'[ ]*([^']*)[ ]*'→": '$1' - 裸字符串去空格(无引号):
":s*([a-zA-Z0-9._-]+)→": $1(注意这个只适用于纯标识符,别乱套在含空格的字符串上) - 千万别用
":s*(.*)直接捕获——.*是贪婪的,遇到下一行的 key 也会吞进去
把多行字典转成单行 JSON 对象
从 YAML 或配置片段转 JSON 常见需求,但直接 ^s*(.*?):s*(.*?)$ + "$1": $2, 会漏掉最后一项逗号、引号不闭合、还可能把注释当 key。
- 先确保全文无注释:搜
#[^ ]*→ 替换为空(或先备份) - 再统一缩进:搜
^[ ]+(?=[a-zA-Z_])→ 替换为空(去掉所有行首缩进) - 拼接 JSON:查找
^([a-zA-Z_][a-zA-Z0-9_]*):s*(.+)$,替换为"$1": $2, - 最后手动补
{开头、}结尾,并删掉最后一行末尾的逗号——正则不适合做“最后一项除外”逻辑,交给人工更稳 - 如果 value 含换行(如多行 description),必须先用
Replace All把换行转义为,否则 JSON 无效
为什么 $1 总是原样输出、不展开
这是字典处理中最常卡住的点:写了 (key):(.*) 却在替换框输 "$1": "$2",结果输出的是字面量 $1 而非实际 key 名。
- 第一检查:右下角
.*按钮是否为蓝色?没启用正则模式,$1就是普通字符 - 第二检查:查找框里有没有括号
()?没捕获组就没有$1可引用 - 第三检查:别混用
和$1—— Sublime 只认$1,在替换框里就是字面反斜杠+1 - 第四检查:value 里如果有
$符号(如price: $100),需写成$$才能输出一个$,否则会被当成变量引用前缀 - 最保险操作:点
Replace Preview(Ctrl+Shift+H),看预览是否已正确展开,再点Replace All
字典文件的结构看似简单,但 key 的命名规则、value 的引号/空格/换行组合起来,会让正则变成“纸面正确、实际漏匹配”的陷阱。每次替换前,用小样本试两轮比硬着头皮全量跑更省时间——尤其当 value 含转义或嵌套时,宁可分步,别贪一键。











