将逗号分隔的字符串转换为嵌套数组,RegExp?

时间:2016-01-22 17:00:50

标签: javascript arrays regex

得到这种类型的字符串:

var myString = '23, 13, (#752, #141), $, ASD, (#113, #146)';

我需要将其拆分为数组,并使用逗号作为分隔符,但也将(..)转换为数组。

这是我想要的结果:[23, 13, ['#752', '#141'], '$', 'ASD', ['#113', '#146']];

我拥有庞大的数据集,因此尽可能快地使其变得非常重要。什么是最快的方式?做一些技巧RegExp功能或手动查找索引等。?

这是一个jsbin:https://jsbin.com/cilakewecu/edit?js,console

3 个答案:

答案 0 :(得分:5)

将parens转换为括号,引用字符串,然后使用JSON.parse

JSON.parse('[' + 
  str.
    replace(/\(/g, '[').
    replace(/\)/g, ']').
    replace(/#\d+|\w+/g, function(m) { return isNaN(m) ? '"' + m + '"' : m; })
  + ']')

> [23,13,["#752","#141"],"ASD",["#113","#146"]]

答案 1 :(得分:2)

您可以使用RegEx

/\(([^()]+)\)|([^,()\s]+)/g

RegEx Explanation:

RegEx包含两部分。 首先,捕获括号内的任何内容。 第二,捕获简单值(字符串,数字)

  1. \(([^()]+)\):匹配括号内的任何内容。
    • \(:匹配(文字。
    • ([^()]+):匹配除()以外的任何内容,并在第一个捕获的群组中添加匹配项。
    • \):匹配)文字。
  2. |:RegEx中的OR条件
  3. ([^,()\s]+):匹配除,(逗号),括号()以及空格一次或多次以外的任何字符,并在第二次捕获时添加匹配组
  4. RegEx Flow Diagram

    <强>演示:

    &#13;
    &#13;
    var myString = '23, 13, (#752, #141), ASD, (#113, #146)',
        arr = [],
        regex = /\(([^()]+)\)|([^,()\s]+)/g;
    
    // While the string satisfies regex
    while(match = regex.exec(myString)) {
    
        // Check if the match is parenthesised string
        // then
        //     split the string inside those parenthesis by comma and push it in array
        // otherwise
        //     simply add the string in the array
        arr.push(match[1] ? match[1].split(/\s*,\s*/) : match[2]);
    }
    
    console.log(arr);
    document.body.innerHTML = '<pre>' + JSON.stringify(arr, 0, 4) + '</pre>'; // For demo purpose only
    &#13;
    &#13;
    &#13;

答案 2 :(得分:-2)

只需使用split方法。

&#13;
&#13;
var str = '23, 13, (#752, #141), ASD, (#113, #146)',
    newstr = str.replace(/\(/gi,'[').replace(/\)/gi,']'),
    splitstr = newstr.split(',');
&#13;
&#13;
&#13;