我有一个如下所示的 JSON:
{"queueNumber": "123","field":"name",UserId":[12,12,34],"cur":[{"objectName":"test","uniqueNumber":"123456"}]}
如果键值对与给定字段匹配,我想删除它。 我正在使用下面的正则表达式。如果值的类型是数组,它不会删除键。
ex: UserId":[12,12,34]
(,\s*"(queueNumber|name|uniqueNumber|cur|UserId)\d*":\s*(".*?"|\d+.\d+|\w+))|("(queueNumber|name|uniqueNumber|cur|UserId)\d*":\s*(".*?"|\d+.\d+|\w+)(\s*,)?)
电流输出:
{"UserId":[12,12,34],"cur":[{"objectName":"test"}]}
预期输出:
{"cur":[{"objectName":"test"}]}
很明显,正则表达式不是实现此目的的理想方法。但是,目前我们必须使用正则表达式来解决这个问题。
如何改进这个正则表达式来处理这种情况?
我对正则表达式的了解非常少。所以,我在这里寻求帮助。
提前致谢!
注意:我必须使用正则表达式删除它,而不是使用任何其他语言。请不要发布任何这些答案或将其标记为可能重复的问题。
常规语法的概念。例如,正则表达式只能用于解析用正则语法编写的内容,而且最重要的是,JSON 不是正则语法。 因此,您无法使用 RE 来解析 。
你被要求这样做。好的。如果我让你打破光速怎么办?或者让 2+2 等于 5?答案很简单:
你被要求做一些不可能做的事情。 你可以在 JSON 上添加一堆子句来使其变得规则,但是这样,它就不再是 JSON。您还可以编写一个基于 RE 的 JSON 解析器/修改器,它只是对某些输入执行错误的操作,但这样您就会得到不正确的算法。
针对您的情况,可以根据具体情况进行。 (至少,如果你的例子确实具有代表性的话。)
改变
(".*?"|\d+.\d+|\w+)
到
(".*?"|\[[\d,]+\]|\d+.\d+|\w+)
。然后我会回去复习第三条和第四条。
第三个可能应该是\d+\.\d+
,并且可能证明添加变体
\d+
是合理的。另一方面,也许您还想捕获 1E10
,但不是 1.1E10
。
第四个应该只匹配选定的关键字(true
、false
、null
),所以你应该只命名它们。