2014-02-14 96 views
0

我寫一個正則表達式把字符串字符串轉換爲以參數

"fetchSomething('param1','param2','param3')" 

到正確的函數調用掙扎作用。我可以通過一些拆分和子字符串來實現,但寧願用.match爲了效率(和我自己的教育)而使用捕獲組。

然而,當我使用

'something("stuff","moreStuff","yetMoreStuff")'.match(/(?:\(|,)("?\w+"?)/g) 

我得到

["("stuff"", ","moreStuff"", ","yetMoreStuff""] 

不管?:的哪個是同樣的結果,這混淆了我,因爲我覺得?:會導致它忽略第一個捕獲組?還是我完全錯過了解捕獲小組?

+2

我建議你使用一個實際的JS句法分析器,如http: //esprima.org/。或者,根據輸入的來源和整體環境,「eval」呢? –

+0

FWIW,如果使用'.match'和'g'修飾符,則數組只返回整個匹配項,而不是捕獲組。你可能想看看['.exec'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec) –

+0

我受限於我們已經有不幸的圖書館。我們使用extJS。我也將此視爲理解正則表達式的練習。 – Blue

回答

0

當您的g標誌處於活動狀態時,您會看到整個字符串。如果你只次比賽後去,那麼你將需要使用.exec和循環:

var regex = /(?:\(|,)("?\w+"?)/g; 
var s = 'something("stuff","moreStuff","yetMoreStuff")'; 
var match, matches=[]; 

while ((match=regex.exec(s)) !== null) { 
    matches.push(match[1]); 
} 

alert(matches); 

jsfiddle

+0

這會在''fetchSomething('param1','param2','param3')「'上失敗,這是問題中的第一個例子。如果要解析的表達式中的任何參數包含轉義的雙引號,逗號或左括號,則這將失敗。費利克斯金在對這個問題的評論中對這筆錢是正確的。 – Louis

+0

@Louis我實際上期待OP會告訴類似的事情,並相應地改變正則表達式,但他們沒有。如果你想根據你指出的問題得到一個不容易破解的正則表達式,你可以使用類似於[that](http://regex101.com/r/cX6gP8)的東西。 OP的目標是獲得更多練習,並且他們的圖書館數量有限。他們的問題是否應該因此而被忽略? – Jerry