RegEx仅匹配JSON字符串中最内层的数组

时间:2015-04-06 19:01:00

标签: javascript regex json

首先,这是以友好的格式向用户显示JSON,因此访问解析的JSON对象无法提供帮助

我知道JS中的JSON对象可以为我打印JSON ,但是,我需要略微修改该输出,这就是这个问题的内容。

在JSON中(由JSON.stringify()完美打印):

{
  a:[
    {
      c: [
          "c",
          "d"
        ]
    }
  ]
}

我怎么才匹配 [ "c", "d" ]

懒惰的正则表达式(/\[(?:\S*\s*)+?\]/g)匹配

a: [
    {
      c: [
          "c",
          "d"
        ]

哪个不好。

我希望从最里面的数组中删除空格,从最初的JSON中得到类似的东西:

{
  a:[
    {
      c: ["c", "d"]
    }
  ]
}

接受的答案正是我最初要求的答案,但我忘了提到阵列的元素之间也有空格,所以正则表达式替换似乎不是一个选项。

相反,我使用提供的正则表达式匹配字符串,然后循环匹配并从每个匹配中删除空格,然后用新字符串替换JSON数据中的初始匹配。

以下是代码:

var jsonData = JSON.stringify(obj, null, 2);
var matches = jsonData.match(/\[\s*[^\[\]]*?\s*\]/g);
jsonData = matches.reduce(function (json, match) {
    return json.replace(match, match.replace(/\s/g, ""));
},  jsonData);

1 个答案:

答案 0 :(得分:1)

\[\s*([^\[\]]*?)\s*\]

只匹配最里面的[...]并捕获组1中前导空格和尾随空格之间的所有内容,因此如果您将其替换为[$1],那么您将获得所需的结果。

result = subject.replace(/\[\s*([^\[\]]*?)\s*\]/g, "[$1]");

测试live on regex101.com

从本质上讲,它是一个不太复杂的版本,你找到的解决方案正在做什么,还有它在JavaScript中运行的额外好处。另一个问题是.永远不会匹配JavaScript中的换行符,与其他语言不同 - 如果您将[\s\S]替换为.,那么正则表达式也会起作用(但是过度杀伤力)对于这里的问题)。