正则表达式:从json列表中删除引号

时间:2008-12-03 18:26:10

标签: javascript regex json

我有一个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]}]

3 个答案:

答案 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格式正确,则意味着左括号当前位置之前,因此匹配发生在列表中。