如何改进正则表达式以移除JSON对象中指定键值对(含数组值)
改进正则处理含数组/嵌套对象的JSON键值对移除
你的原正则问题出在值匹配范围太窄,只覆盖了字符串、数字和单词,没处理数组[]和嵌套对象{}这类复杂值,所以"UserId":[12,12,34]这种项没被匹配移除。以下是适配你场景的改进正则:
最终正则
(,\s*"(queueNumber|UserId|uniqueNumber)":\s*(?:"[^"]*"|\d+|\[[^\]]*\]|\{[^{}]*\}))|("(queueNumber|UserId|uniqueNumber)":\s*(?:"[^"]*"|\d+|\[[^\]]*\]|\{[^{}]*\})(\s*,)?)|(,\s*"[^"]*":\s*"name")|("[^"]*":\s*"name"(\s*,)?)
正则拆解(按匹配逻辑分块)
- 匹配带前置逗号的指定键项:
(,\s*"(queueNumber|UserId|uniqueNumber)":\s*(?:"[^"]*"|\d+|\[[^\]]*\]|\{[^{}]*\}))- 覆盖数组(
\[[^\]]*\]匹配[]包裹的所有内容)和单层嵌套对象(\{[^{}]*\}匹配{}包裹的所有内容),同时兼容字符串、数字值
- 覆盖数组(
- 匹配无前置逗号(开头)或带后置逗号的指定键项:
("(queueNumber|UserId|uniqueNumber)":\s*(?:"[^"]*"|\d+|\[[^\]]*\]|\{[^{}]*\})(\s*,)?)- 处理键值对在JSON开头,或者后面跟着逗号的情况,避免残留逗号
- 匹配带前置逗号的"值为name"的项:
(,\s*"[^"]*":\s*"name")- 精准匹配
"field":"name"这类值为"name"的键值对(不管键名是什么)
- 精准匹配
- 匹配无前置逗号或带后置逗号的"值为name"的项:
("[^"]*":\s*"name"(\s*,)?)- 同样处理开头或末尾的这类项
测试结果
将原JSON用此正则替换为空字符串后,得到:
{"cur":[{"objectName":"test"}]}
完全符合你的期望输出。
注意事项
- 仅支持单层嵌套的JSON结构,多层嵌套(如数组里套对象)会失效
- 不支持带转义字符的字符串(如
"key":"val\"ue"),如果有这类场景需要额外调整转义处理逻辑 - 重申:正则处理JSON是临时hack方案,仅适合固定简单结构的场景
内容的提问来源于stack exchange,提问作者daringfireball
相关产品推荐
相关产品推荐

