2014-03-06 26 views
2

我不知道爲什麼這些正則表達式是不等價的:JS正則表達式:匹配重複模式

/(a)(a)(a)/.exec ("aaa").toString() => "aaa,a,a,a" , as expected 
/(a){3}/.exec ("aaa").toString() => "aaa,a"  :(
/(a)*/.exec ("aaa").toString()  => "aaa,a"  :(

如何必須最後兩個被改寫,使他們表現得像第一?重要的是我想要任意倍數匹配和記憶。

下面一行

/([abc])*/.exec ("abc").toString() => "abc,c" 

表明,只有一個字符每括號保存 - 最後一場比賽。

+0

我在前一天試圖解決這個確切的問題。如果您搜索它們,還有其他關於這個確切問題的主題。簡短的回答是,這在JS中不受支持。 ':(''確實是 – acbabis

+0

你能舉一個你遇到這個問題的例子嗎?就像你希望匹配的一個例子字符串和你想要的返回值一樣。「aaa」之間差異的原因僅僅是那裏的事實是一個不同數量的捕獲組 – Nucleon

+0

我只是試圖用regexp來實現字符串的爆炸函數,並且想進一步做一些語法分析的實驗,我通過'str.match(/([^ \ n \ t \( \)] + | \(| \))/ g)' - 這也把括號當作記號。但是我認爲這不是問題的解決方案 – Christoph85LE

回答

3

你可能正在尋找這樣的:

var re = /([abc])/g, 
    matches = [], 
    input = "abc"; 
while (match = re.exec(input)) matches.push(match[1]); 

console.log(matches); 
//=> ["a", "b", "c"] 

記住任何匹配組會給你最後一個匹配的模式不是全部。

+0

如果只匹配'(a)( a)(a)'。如果你想匹配'(a)(b)*(c)',你必須切斷字符串,這是不幸的 – acbabis

+0

謝謝!功能,這就是我想要的。它必須是可能的 - 或者會是很好的 - 正則表達式爲我做,但我擔心它必須手工編碼;) – Christoph85LE

+0

是的,這是最好的,你可以得到。 – anubhava

0

使用RegexBuddy介紹非常好:

注意:您反覆捕獲組本身。該組將捕獲 只有最後一次迭代