2

我不确定计数是否是正确的词,因为对我来说有多少并不重要,但让我解释一下。我的数据将像这样格式化:(hi,(1,2),hey),(yo,(3,(rawr),4),howdy)我无法控制有多少维度。我想抓住最低的组
["hi", Array[], "hey"]["yo", Array[], "howdy"]所以如果有一种方法可以“计数”,我可以计算左括号,然后计算闭括号,当它达到 0 时,这就是正则表达式结束的时候。例如:

(hi,(1,2),hey),(yo,(3,(rawr),4),howdy)
1---2---1----0-1---2--3----2--1------0

话虽如此,我不相信计数是可能的,但我想要的是一个替代解决方案。这是我到目前为止所拥有的,/\([^\(]*?\)/但它只返回来自每个低级别组的最高级别组 aka(1,2)(rawr).

4

4 回答 4

3

您可以使用堆栈来跟踪(and )

Array.reduce(
    '(hi,(1,2),hey),(yo,(3,(rawr),4),howdy)',
    function(x,y){
        if(y=='(')
            return [x[0]+1, x[1]+(x[0]+1)]
        else if(y==')')
            return [x[0]-1, x[1]+(x[0]-1)]
        else
            return [x[0], x[1]+'-']
    },
    [0,'']
)[1]

firebug在控制台中尝试。

于 2012-09-07T00:43:56.570 回答
0

这适用于原始用例和@Barmar 的用例 - 如果你真的想要的话,它会计算括号......

此外,我在数据字符串中添加了任意空格 - 以防万一(因为您无法控制传入的数据)

var results = [];
var dataString = "(hi, (1,2) , hey), ( yo,( 3, ( rawr   ), 4) ,   howdy  )";
//var dataString = "(hi, (1 , 2 ), (3, 4),   hey), (yo ,(3,(rawr ), 4), howdy)";


var dataSplit = dataString.split(",");

var trimRegex = /^\s+|\s+$/g;
var openParensRegex = /\(/;
var closeParensRegex = /\)/;
var parensRegex = /\(|\)/;

var parensCount = 0;

for (var x = 0, lenx = dataSplit.length; x < lenx; x++){
    var cleanString = dataSplit[x].replace(trimRegex, "");

    if (openParensRegex.test(cleanString)){ parensCount++; };

    if (parensCount < 2){
        results.push(cleanString.replace(parensRegex, "").replace(trimRegex, ""));
    };

    if (closeParensRegex.test(cleanString)){ parensCount--; };
};

console.log(results);

希望有帮助!

于 2012-09-07T01:23:47.667 回答
0

以下脚本可能会有所帮助,它将识别括号级别:

var string="(hi,(1,2),hey),(yo,(3,(rawr),4),howdy)",i=0;
while (string.indexOf("(")>=0) {
    i++;
    string=string.replace(/\(([^()]+)\)/g,"|l"+i+"|$1|l"+i+"|");
}

结果:|l2|hi,|l1|1,2|l1|,hey|l2|,|l3|yo,|l2|3,|l1|rawr|l1|,4|l2|,你好|l3|

小提琴:http: //jsfiddle.net/GfUZh/

于 2012-09-07T15:54:24.450 回答
-1

如果您想获得最高级别,您可以使用正则表达式通过查找交点来实现,在这种情况下),(

var str = '(hi,(1,2),hey),(yo,(3,(rawr),4),howdy)';
var re = /(\(.+\)),(\(.+\))/;
var results = re.exec(str);
results.shift(); // remove first item which is useless
console.log(results); //=> ["(hi,(1,2),hey)", "(yo,(3,(rawr),4),howdy)"]

演示:http: //jsfiddle.net/elclanrs/fFmfE/

于 2012-09-07T00:41:36.293 回答