鉴于我有一个表示JSON对象的字符串。它可能是无效,因为可能有一些params将被另一个系统替换(例如%param%)。我需要删除所有已知propertyName等于" true"使用正则表达式。
{
"someTopLevelProp": "value",
"arrayOfData": [
{
"firstPropIAlwaysKnow": "value",
"dontCareProp": $paramValue$,
"dontCareProp2": 2,
"flagWhichShouldIUse": true,
"somethingAtTheEnd": "value"
},
{
"absolutelyAnotherObject": %paramValue%
},
{
"firstPropIAlwaysKnow": "value",
"dontCareProp": "value",
"dontCareProp2": 2,
"flagWhichShouldIUse": false,
"somethingAtTheEnd": "value"
},
{
"firstPropIAlwaysKnow": "value",
"dontCareProp": "value",
"dontCareProp2": 2,
"flagWhichShouldIUse": true,
"somethingAtTheEnd": "value"
}
]
}
在上面的示例中,我总是拥有" firstPropIAlwaysKnow "这意味着该对象可以包含我需要的标志。之后可能还有其他属性。但最重要的是" flagWhichShouldIUse " prop,这意味着应删除此对象(但仅在值等于' true'时)。结果我应该收到:
{
"someTopLevelProp": "value",
"arrayOfData": [
{
"absolutelyAnotherObject": %paramValue%
},
{
"firstPropIAlwaysKnow": "value",
"dontCareProp": "value",
"dontCareProp2": 2,
"flagWhichShouldIUse": false,
"somethingAtTheEnd": "value"
}
]
}
我对正则表达式的了解不够强,所以请求社区的帮助。
P.S。请不要提到用正则表达式解析JSON它疯狂\不正确\坏主意 - 请确保我知道。
答案:现在我有正在使用的正则表达式。谢谢大家试图在这里提供帮助的人。也许对某人有用。
/{\s+?"firstPropIAlwaysKnow": "value"[^{}]+?(?:\{[^}]*\}[^}]+?)*[^}]+?"flagWhichShouldIUse": true[^}]+?},?/gi
答案 0 :(得分:3)
你真的不能用正则表达式做到这一点。这样的事情可能有用:
let filtered = jsonstring
// split into the individual 'objects'
// might need to modify this depending on formatting. You
// could use something like /},\s*{/ to split the string,
// but couldn't re-join with same formatting
.split('},{')
// filter for only the strings with the relevant property
// set to false
.filter(s => s.match(/"flagWhichShouldIUse":\s*false/) // again, may need to change
// put humpty-dumpty back together again
.join('},{');
精确的分割方法在很大程度上取决于JSON的结构,这不是万无一失的。它没有正确处理嵌套。如果您的JSON打印得很漂亮,您可以使用制表符/空格字符的数量作为拆分器的一部分:例如,这只会拆分一个选项卡:/\n\t},\s*{/