You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改正则表达式以实现嵌套JSON数组单行格式化?

解决JSON嵌套数组单行化的Perl正则方案

原正则的问题在于用了.*?(?=\])的非贪婪匹配,遇到嵌套数组里的第一个]就会终止匹配,没法覆盖整个嵌套结构。要处理嵌套数组,得用Perl支持的递归正则来匹配平衡的[]结构。

直接上修改后的正则:

s/:\s*\[\K\s*( (?: [^\[\]]+ | \[(?1)\] )* ) (?=\])/$1=~s/\s+//gr/egsx

关键修改点解析:

  • 用递归捕获组(?: [^\[\]]+ | \[(?1)\] )*替代原来的.*?(?=\]):
    • [^\[\]]+:匹配非括号的普通字符
    • \[(?1)\]:递归匹配嵌套的[]结构,(?1)引用当前捕获组的规则,确保能识别嵌套的闭合括号
  • 保留\K来忽略冒号和左括号的匹配部分,只处理数组内部的内容
  • 替换逻辑$1=~s/\s+//gr:把捕获到的整个数组内容(包括嵌套部分)里的所有空白(换行、空格、制表符等)全部清除,r修饰符保证返回处理后的字符串而不修改原变量

处理含括号的JSON字符串(可选)

如果你的数组里有包含[/]的字符串(比如"item[0]"),上面的正则会误解析,这时需要加入字符串匹配分支:

s/:\s*\[\K\s*( (?: "(?:\\.|[^"])*" | [^\[\]"']+ | \[(?1)\] )* ) (?=\])/$1=~s/\s+//gr/egsx

新增的"(?:\\.|[^"])*"会匹配完整的JSON字符串,确保字符串内部的括号不会被当成数组结构处理。

示例效果

原JSON:

{
  "data": [
    "apple",
    [
      100,
      200
    ],
    {"key": "value[1]"}
  ]
}

处理后变成:

{
  "data": ["apple",[100,200],{"key":"value[1]"}]
}

内容的提问来源于stack exchange,提问作者Maïs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 08:40:20