根据另一个属性值替换JSON数组中对象的属性

时间:2020-05-11 17:00:57

标签: json regex replace

我正在为调试代理编写正则表达式规则(也可能适用于在Notepad ++或类似语言中处理文本)。

我有一个JSON形式的对象数组,如果其他属性值匹配,则需要替换一个对象的值

[
    { "name": "alpha", /* a lot of omitted properties */, "foo": "bar", /* a lot of omitted properties */},
    { "name": "beta", /* a lot of omitted properties */, "foo": "baz", /* a lot of omitted properties */ },
    { "name": "gamma", /* a lot of omitted properties */, "foo": "bat", /* a lot of omitted properties */ }
]

在此示例中,我希望正则表达式匹配foo = baz的对象并将其名称替换为replacedName,因此替换模式可能类似于$1replacedName$2

我尝试过:(regex101 link

({\s*"name":\s*")(?:\w+)"([\S\s]+?"foo":\s*"baz".*?})

但是随后表达式匹配第一个和第二个对象,并且第一个的名称被替换。如何使正则表达式停止评估下一个对象?

1 个答案:

答案 0 :(得分:0)

解决方案是确保您永远不会匹配JSON }的大括号-因此,与其使用[\S\s]*?.*?之类的东西,不如使用{{1 }}:(regex101 link

[^}]*?

一些改进:使它可以处理介于两者之间的嵌套对象;删除对象开头和结尾的不必要的匹配:(regex101 link

({\s*"name":\s*")(?:\w+)("[^}]+?"foo":\s*"baz".*?})

如果搜索词在需要替换的值之前,则表达式为:(regex101 link

("name":\s*"\s*)(?:[^"]+)("[^}]*?(?:\{[^}]*?\}[^}]*?)*?"foo"\s*:\s*"baz")

在两种情况下,替换都是相同的("foo"\s*:\s*"baz"[^}]*?(?:\{[^}]*?\}[^}]*?)*?"name":\s*"\s*)(?:[^"]+)(")