我正在为调试代理编写正则表达式规则(也可能适用于在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".*?})
但是随后表达式匹配第一个和第二个对象,并且第一个的名称被替换。如何使正则表达式停止评估下一个对象?
答案 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*)(?:[^"]+)(")