假设我有字符串:"((a,(b,c)),(d,(e,(f,g))))"
如何分别提取每对,例如拆分第一对并提取(a,(b,c))
和(d,(e,(f,g)))
。
我对如何处理这个问题感到很遗憾。由于对可以变化,因为我不能精确地寻找设定模式。
我认为对此的一种方法是确定","
在最外面的括号中的位置。比如在( (set of pairs 1) , (set of pairs 2))
找到它。
所以我可以把剩下的一切都拿走了。但我不知道该怎么做。使用str.Indexof()
将首次出现","
,而不是我感兴趣的那个。
答案 0 :(得分:0)
我会遍历字符串的字符,跟踪括号的嵌套方式,找到第一个没有嵌套的逗号,然后(如你所说)将部分放在左边和右边:
function getPairs(input) {
// remove outer parentheses, if present
if (input[0] === "(")
input = input.slice(1,-1);
// find first comma that isn't inside parentheses
var parenNestLevel = 0;
for (var i = 0; i < input.length; i++) {
if (parenNestLevel === 0 && input[i] === ",")
return [input.slice(0, i), input.slice(i+1)];
else if (input[i] === "(")
parenNestLevel++;
else if (input[i] === ")")
parenNestLevel--;
}
// note: returns undefined if the input couldn't be parsed
}
var input = "((a,(b,c)),(d,(e,(f,g))))";
var pairs = getPairs(input);
console.log(pairs);
console.log(getPairs(pairs[0]));
对于你的输入,那将返回数组["(a,(b,c))", "(d,(e,(f,g)))"]
,然后你可以在返回的数组的部分运行getPairs()
,或者使它递归,或者其他什么 - 你真的没有它清楚最终输出应该来自您的样本"((a,(b,c)),(d,(e,(f,g))))"
输入。
答案 1 :(得分:0)
这是一个更简单的解决方案。我们首先删除第一个和最后一个括号,然后将结果字符串拆分为'),(',然后迭代结果并根据它们的位置将缺少的括号添加/追加到各个元素:
var a = "((a,(b,c)),(d,(e,(f,g))))";
var b = a.substring(1,a.length-1); //remove first and last parenthesis
var c = b.split('),('); //get pairs
for(var i=0;i<c.length;i++){
if(i%2===0){
c[i] = c[i]+')';
}else{
c[i] = '('+c[i];
}
}
console.log(c); // ["(a,(b,c))", "(d,(e,(f,g)))"]