如何修改正则表达式以实现嵌套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
相关产品推荐
相关产品推荐

