首页 > 解决方案 > 基于另一个属性值替换 JSON 数组中对象的属性

问题描述

我正在为调试代理编写一个正则表达式规则(也可以应用于在 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 链接

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

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

标签: jsonregexreplace

解决方案


解决方案是确保您永远不会匹配 JSON 的右花括号}- 所以不要使用类似[\S\s]*?or的东西.*?,而是更具体地使用[^}]*?:(regex101 链接

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

一些改进:使其与中间的嵌套对象一起工作;删除对象开头和结尾的不必要匹配:(regex101 链接

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

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

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

在这两种情况下,替换是相同的$1replacedName$2


推荐阅读