我有一个json格式的对象数组:
[
{
"name": "obj1",
"list": [
"elem1",
"elem2",
"elem3"
]
},
{
"name": "obj2",
"list": [
"elem4",
"elem5",
"elem6"
]
}
]
现在我想构建regexp,使用javascript删除“list”中元素周围的引号。
理想的结果:
[{"name":"obj1", "list":[elem1, elem2, elem3]},
{"name":"obj2", "list":[elem4, elem5, elem6]}]
答案 0 :(得分:1)
这很有效,但它不是纯正的正则表达式:
var str = '[{"name":"obj1", "list":["elem1", "elem2", "elem3"]},'
+ '{"name":"obj2", "list":["elem4", "elem5", "elem6"]}]';
str = str.replace(/"list":\[[^\]]+\]/g, function (match) {
return '"list":' + match.substring(7, match.length).replace(/([^\\])"/g, '$1');
});
document.write(str);
基本上,它将过程分为两个:首先,找到列表子串;第二,从中删除撇号。
如果javascript支持可变长度的lookbehind,你可以使用纯正则表达式执行此操作,但它不支持。
根据MrP的建议,编辑允许列表元素中的转义撇号。
答案 1 :(得分:1)
如果[elem1,elem2,elem3]要成为对DOM元素或甚至现有变量的引用,那么可能将您的JSON字符串转换为JavaScript对象然后替换字符串可能是更好的方法。
例如,如果它们都是DOM元素id值,那么在将JSON字符串转换为对象之后,您可以执行object["list"][0] = document.getElementById(object["list"][0])
或对您的对象有意义的事情。
答案 2 :(得分:0)
这可以解决你所描述的问题:
str = str.replace(/"(?=[^\[]*\])/g, '');
在匹配引号后,向前检查前方是否有一个右方括号,但它与当前位置之间没有开括号。如果JSON格式正确,则意味着左括号在当前位置之前,因此匹配发生在列表中。