2015-06-05 58 views
0

在Javascript中我想代表全2個括號之間的文本字符串,即使該字符串包含更多的括號內的文字。獲取括號

它的工作如下:

「(A)(B)(C)」 匹配(東西);

[ 「一」, 「B」, 「C」]

OR

「一」

「((A)(B )(c))「。match(SOMETHING);

「(一)(二)(三)」

+1

什麼你嘗試這麼遠嗎? –

+0

/\(([^)] +)\)/ - 但它返回[ 「((A)」, 「(一個」]爲字符串 「((A)(B)(C))」 – JOster

+2

I」敢肯定這樣的語言是不規律的,因爲識別引擎將需要一個堆棧(或以其他方式使用的內存不恆定的量)。正則表達式是不太可能是這項工作的正確工具。 – apsillers

回答

1

這應該做的伎倆:

(?:\()[^\(\)]*?(?:\)) 

它是如何工作

  • \(匹配開頭括號
  • \)比賽閉括號
  • [^\(\)]從多個托架
  • 開匹配任何
  • *?添加零分或多次量詞上述圖案(由?懶言)

JavaScript實現

嘗試:

your_string.match(/(?:\()[^\(\)]*?(?:\))/g) 
+0

「((a)(b)(c))」match (/ \([^ \(\)] *?\)/) - 但它返回[「(a)」] – JOster

+0

不要麻煩解釋,不起作用(嘗試'((a)b(c))') – Amit

+0

不起作用,但謝謝你的正則表達式的解釋。 – JOster

0

你關心的括號匹配? 如果是這樣,你將不得不使用正則表達式來使用堆棧。

嘗試這樣:

var str = "aaa((0)12(2))bbb"; 
 
var stack = []; 
 
var result =""; 
 
var start = false; 
 

 
for (var i = 0; i < str.length; i++) { 
 
    switch (str[i]) { 
 
    case '(': 
 
     stack.push('('); 
 
     if (!start) { 
 
     start = true; 
 
     continue; 
 
     } 
 
     result += str[i]; 
 
    break; 
 
    case ')': 
 
     if (stack[stack.length - 1] === '(') { 
 
     stack.pop(); 
 
     if (stack.length === 0) { 
 
      start = false; 
 
      continue; 
 
     } 
 
     result += str[i]; 
 
     } else { 
 
     //not balanced! 
 
     } 
 
     
 
    break; 
 
    default: 
 
     if (start){ 
 
     result += str[i]; 
 
     } 
 
    } 
 
} 
 

 
console.log(result);

+0

在我的情景中,parens總是匹配。謝謝,這個答案是可靠的。 – JOster

+0

所以我的問題實際上是要求在**括號內的文本**。所以我調整了一下你的代碼。 – JOster