2017-04-09 53 views
3

我有這樣一個字符串如下:'(1) (2 (3))'
我想它的正則表達式得到以下陣列:['1', '2 (3)']
另一個例子:'(asd (dfg))(asd (bdfg asdf))(asd)' - >['asd (dfg)', 'asd (bdfg asdf)', ('asd')]分割字符串的最頂層括號

我已經試圖搜索如何做這樣的正則表達式,但我只找到了所有()分裂的,找不到任何東西只過濾它們的最高級別。

+0

這可以通過遞歸來完成'(\((:^()] |(1))* \)?)'。但是,JavaScript中不支持。 – Vallentin

+3

括號不是常規語言(它是Type-2語法,請參閱https://en.wikipedia.org/wiki/Chomsky_hierarchy),所以我認爲通用正則表達式不可能創建 –

+1

所以如果我想分析這個,我將不得不開始令牌解析和東西?這正是我想要避免的。太糟糕了。 –

回答

1

我不明白的方式用正則表達式來解決這個問題,這裏有一個編程方法(雖然有可能是很多更優雅的方式來處理這個問題......特別是因爲它是很脆弱的,它依賴於括號始終以正確的順序應用)。

var string = "(asd (dfg))(asd (bdfg asdf))(asd)".split(''), 
 
    result = [], 
 
    fragment = '', 
 
    countOpen = 0, 
 
    countClosed = 0; 
 
    
 
    
 
string.forEach(function (character) { 
 
    fragment += character; 
 
    
 
    if (character === '(') { 
 
     countOpen += 1; 
 
    } 
 
    
 
    if (character === ')') { 
 
     countClosed += 1; 
 
    
 
     if (countOpen === countClosed) { 
 
      result.push(fragment.slice(1, -1)); 
 
      fragment = ''; 
 
     } 
 
    } 
 
}); 
 

 
console.log(result);

相關問題