sublime text本身不支持用正则真正格式化json,因其无解析器,无法识别嵌套、引号边界或转义;推荐使用内置reindent命令(需状态栏显示json)或json解析器驱动的插件如pretty json。

Sublime Text 本身不支持用正则表达式“真正格式化”JSON数据——它没有解析器,不能识别嵌套结构、引号边界或转义序列。所谓“用正则美化 JSON”,本质是暴力替换换行/空格,极易破坏数据,不推荐作为常规手段。
reindent 命令比正则更安全可靠
reindent 是 Sublime 内置命令(不是插件),只调整缩进和换行,不碰内容、不校验、不改转义。它比任何正则都稳,因为它是基于语法作用域(source.json)触发的。
- 必须先确保右下角状态栏显示为
JSON(不是Plain Text或JavaScript) - 全选内容后,右键 →
Reindent,或按Ctrl+Shift+P输入reindent回车 - 它不会处理非法 JSON(如单引号、尾随逗号),但也不会崩、不会静默乱改
- 不依赖 Package Control,无需装插件,ST3/ST4 均可用
为什么正则格式化 JSON 几乎必然出错
你看到的“正则教程”通常长这样:s/([{[,])\s*/$1\n/g,这类表达式在真实 JSON 中会:
- 把字符串里的
{(比如"path": "/api/{id}")也当对象起始符替换,直接撕裂数据 - 忽略引号内反斜杠转义(
"msg": "a\nb"→ 换行后变成两行,JSON.parse失败) - 对嵌套深度无感知,缩进全靠猜,多层数组会错位
- 遇到注释(
//或/<em> </em>/)或末尾逗号就彻底失效
这些不是“配置没调好”,而是正则语言能力的硬限制。
真要手动写正则?只限极简、已知合法的场景
仅当你确认以下全部成立时,才可谨慎尝试(且建议先备份):
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- 数据是单层扁平结构(无嵌套对象/数组)
- 不含任何双引号内的特殊字符(换行、制表、反斜杠)
- 所有键名和字符串值都用双引号,无尾随逗号、无注释
- 目标只是把一行压成多行 + 补空格,不要求语义正确
例如将:{"name":"Alice","age":30}
粗略转为:
{"name": "Alice",
"age": 30}
可用这两步(在 Find 面板开启 Regex):
Find:([{[,])\s<em>([^{[,}]</em>?)\s*([}],])Replace:$1\n $2\n$3
(仅对简单键值对做缩进,不递归)再执行一次
Find:,\s*(?=[}]])→Replace:,(清理末尾换行)
但这仍是临时补救,不是格式化方案。
JSON Reindent 和 Pretty JSON 插件背后调用的是真正的 JSON 解析器(Python 的 json 模块或 js-beautify),它们能区分语法结构和字面量内容。正则做不到这点,也不该被当成替代品。如果你手头只有原始文本、又没装插件,优先用终端跑 python -m json.tool file.json,比任何 Sublime 正则都准。










