2016-09-28 115 views
1

假设我有字符串:"((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

威尔有效输入总是只有*对,或者可能存在'((对的集合1),(对的集合2),(对的集合3))'?您是否需要允许无效输入不遵循该模式? – nnnnnn

+0

不,它总是一对,它可能是((set 1),()),但它不能超过2 –

+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()Ø n返回数组的部分,或者使其递归,或者其他任何 - 你并没有真正清楚输入的样本"((a,(b,c)),(d,(e,(f,g))))"的输出应该是多少。

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)))"] 
+0

如果输入是“”( a,(b,c))“'??(例如,如果试图进一步拆分从初始操作返回的对)。仍然有一对(其第二部分本身是anot她的一对),但没有''),(“'分裂... – nnnnnn

相关问题