我不确定count是否是正确的词,因为它对我来说并不重要,但让我解释一下。我的数据格式如下:(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
现在说,我不相信计数是可能的但我想要的是一个替代解决方案。这是我到目前为止/\([^\(]*?\)/
,但它只返回来自每个低级别组(1,2)
和(rawr)
的最高级别组。
答案 0 :(得分:3)
您可以使用堆栈跟踪(
和)
。
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
控制台中试用。
答案 1 :(得分: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);
希望有所帮助!
答案 2 :(得分: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 |喜,| L1 | 1,2 | L1 |,哎| L2 |,| L3 |哟,| L2 | 3,| L1 | RAWR | L1 |,4 | L2 |,你好| L3 |
答案 3 :(得分:-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)"]