正则格式化json高风险,仅限受限场景;需先提取保护字符串、再按符号层级缩进换行、预处理非法变体、最后还原并清理空白。

直接用正则处理 JSON 字符串的“格式化”(即美化缩进、换行)是高风险操作,不推荐作为常规手段。JSON 是结构化数据,其嵌套、引号、转义、注释缺失等特性极易让正则误判。但若场景受限(如纯前端无 JSON.parse 权限、或需预处理含轻微非法字符的类 JSON 片段),可谨慎使用正则辅助“近似格式化”。核心思路是:先安全分隔关键符号,再按层级插入缩进。
识别并保护字符串字面量,避免误替换
JSON 中的双引号字符串(如 "name": "Alice"s book")内部可能含冒号、逗号、花括号,正则若不跳过字符串内容,会破坏结构。解决方法是:用正则匹配完整字符串(支持转义),将其临时替换成唯一占位符,处理完再还原。
- 匹配字符串的正则:
"(?:[^"\\]|\\.)*"(匹配双引号内非引号/非反斜杠字符,或转义序列) - 实际操作中,先用
str.replace(/"(?:[^"\\]|\\.)*"/g, (m) => `__STRING_${i++}__`)提取并缓存所有字符串 - 后续所有格式化步骤都在“无字符串”的简化文本上进行
按语法符号切分并添加换行缩进
在已剥离字符串的 JSON 骨架上,对 {、}、[、]、,、: 进行有层次的换行处理:
-
{和[后加换行 + 当前缩进 + 下一级缩进 -
}和]前加换行 + 上一级缩进 -
,后加换行 + 当前缩进 -
:后加空格(不换行),保持键值紧凑 - 用计数器模拟缩进层级:遇到
{或[层级+1;遇到}或]层级-1
处理常见非法变体(仅限必要时)
真实场景中常遇到单引号、尾随逗号、无引号键名等非标准写法。正则可做轻量预清洗,但不保证 100% 合法:
- 单引号转双引号:
str.replace(/'([^']*)'/g, '"$1"')(仅当确定无嵌套单引号时可用) - 删尾随逗号:
str.replace(/,s*([}]])/g, '$1') - 补键名引号(简单情况):
str.replace(/({|,)s*([a-zA-Z_]w*)s*:/g, '$1"$2":') - 注意:这些操作可能出错,必须放在格式化前,且建议仅用于日志调试等非生产环境
还原字符串并清理多余空白
完成符号换行后,将之前缓存的字符串按顺序逐个替换回占位符。最后用正则清理因多次换行产生的连续空行和行首尾空格:
- 还原:
formatted.replace(/__STRING_(d+)__/g, (_, idx) => strings[parseInt(idx)]) - 压缩空行:
.replace(/ s* /g, ' ') - 清理行尾空格:
.replace(/[ ]+$/gm, '') - 确保每行缩进统一用 2 或 4 个空格,不用 tab











