json - 基于另一个属性值替换 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".*?})
但随后表达式匹配第一个和第二个对象,并替换第一个的名称。如何使正则表达式停止评估下一个对象?
解决方案
解决方案是确保您永远不会匹配 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
推荐阅读
- amazon-web-services - 在具有不同端口的单个 EC2 上运行两个不同的 Web 应用程序
- android - 如何从资源 XML (Android) 中获取视图 ID 的 IntArray
- mysql - 根据其他 2 列的条件填充列
- python - 使用 TensorFlow 的多类文本分类。输出问题
- mysql - MYSQL 表搜索过滤
- javascript - 三.js CSS3DRenderer如何控制字体大小
- mysql - PHP MYSQL 1 个月后动态增加值
- node.js - 当服务器的端点被命中时,如何通过服务器的套接字连接发送消息?
- c# - 创建实体记录时如何插入自定义字段的值?
- google-apps-script - 是否可以通过 Google 表格中的宏删除特定行的内容?