2011-08-28 193 views

回答

2

使用suat的正則表達式,因爲你想做的事與集團全球配套,你需要使用一個循環讓所有的比賽:

var str = '(Boxing [email protected]@To punch and kick)([email protected]@To keep money in)'; 
var regex = new RegExp('\\((.*?)\\)', 'g'); 
var match, matches = []; 
while(match = regex.exec(str)) 
    matches.push(match[1]); 
alert(matches); 
// ["Boxing [email protected]@To punch and kick", "[email protected]@To keep money in"] 
+0

儘管如此,cwallenpoole演示的方法速度更快,因爲它避免了回溯找到閉幕paren。 – Joey

1

此正則表達式/[^()]+/g匹配所有的字符序列不屬於()

var s = '(Boxing [email protected]@To punch and kick)'+ // I broke this for readability 
     '([email protected]@To keep money in)'.match(/[^()]+/g) 
console.log(s) // ["Boxing [email protected]@To punch and kick", 
       // "[email protected]@To keep money in"] 
+0

這也將匹配''中(富)等等(巴)'blah'。根據OP瞭解輸入字符串的情況,這可能會也可能不會成爲問題。 – Paulpro

0

我創建了一個名爲balanced一些JavaScript庫,幫助像這樣的任務。正如@Paulpro所提到的,如果你在括號之間有內容,那麼解決方案就會中斷,這是平衡的優點。

var source = '(Boxing [email protected]@To punch and kick)Random Text([email protected]@To keep money in)'; 

var matches = balanced.matches({source: source, open: '(', close: ')'}).map(function (match) { 
    return source.substr(match.index + match.head.length, match.length - match.head.length - match.tail.length); 
}); 

// ["Boxing [email protected]@To punch and kick", "[email protected]@To keep money in"] 

繼承人JSFiddle示例

相關問題