2016-09-28 108 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

相關問題