【问题标题】:Regexp: Remove quotation marks from json list正则表达式:从 json 列表中删除引号
【发布时间】:2010-09-25 04:34:49
【问题描述】:

我有一个 json 格式的对象数组:

[
    {
        "name": "obj1",
        "list": [
            "elem1",
            "elem2",
            "elem3"
        ]
    },
    {
        "name": "obj2",
        "list": [
            "elem4",
            "elem5",
            "elem6"
        ]
    }
]

现在我想使用 javascript 构建正则表达式以从“列表”中的元素周围删除引号。

理想的结果:

[{"name":"obj1", "list":[elem1, elem2, elem3]},
 {"name":"obj2", "list":[elem4, elem5, elem6]}]

【问题讨论】:

  • 这对我来说没有意义。引号是 JSON 格式的一部分——一旦删除它们,它就不再是 JSON。那是你要的吗?另外,我很奇怪您实际上在 javascript 中有一个 json 字符串。
  • 投反对票,因为您不应该为此使用正则表达式
  • @hop,你只能在答案中投下无知,如果是问题,你只能投反对票,DOUCHE!

标签: javascript regex json


【解决方案1】:

如果 [elem1, elem2, elem3] 要成为对 DOM 元素甚至是现有变量的引用,那么也许将您的 JSON 字符串转换为 JavaScript 对象,然后再替换这些字符串可能是更好的方法。

例如,如果它们都是 DOM 元素 id 值,那么在将 JSON 字符串转换为对象后,您可以执行 object["list"][0] = document.getElementById(object["list"][0]) 或任何对您的对象有意义的操作。

【讨论】:

  • +1 我也试图猜测为什么这可能是必需的,而您的建议似乎很有可能。
【解决方案2】:

这可行,但它不是纯正则表达式:

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 不支持可变长度后视,您可以使用纯正则表达式来执行此操作。

按照 MrP 的建议,编辑后允许在列表元素中使用转义撇号。

【讨论】:

  • 它根本不支持lookbehind,实际上... :-)
  • 可能需要只删除外部引号,而保留转义的引号完整:return ....replace(/([^\\])"/g, '$1');
【解决方案3】:

这应该可以解决您描述的问题:

str = str.replace(/"(?=[^\[]*\])/g, '');

匹配引号后,前瞻检查前面是否有一个右方括号,但它与当前位置之间没有左方括号。如果 JSON 格式正确,则表示左括号在当前位置之前,因此匹配发生在列表内。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    相关资源
    最近更新 更多