2012-03-20 40 views
9

我是新來的正則表達式。我試圖解析一個字符串中大括號內的所有內容。我查找了this post作爲參考,並完全按照其中一個答案的建議,但結果是意外的。javascript,正則表達式在大括號中解析字符串內容

這裏是我做了什麼

var abc = "test/abcd{string1}test{string2}test" //any string 
var regex = /{(.+?)}/ 
regex.exec(abc) // i got ["{string1}", "string1"] 
      //where i am expecting ["string1", "string2"] 

我覺得我失去了一些東西,我在做什麼錯?

更新

我能與/g得到它的全局搜索

var regex = /{(.*?)}/g 
abc.match(regex) //gives ["{string1}", "{string2}"] 

我怎樣才能得到字符串W/O支架?

回答

17
"test/abcd{string1}test{string2}test".match(/[^{}]+(?=\})/g) 

產生

["string1", "string2"] 

它假定每個}都有相應{之前和{...}部分不嵌套。它也不會捕獲空的{}部分的內容。

+0

很棒,就是我想要的 – 2012-03-20 18:19:33

+3

這很好。但是你不需要逃避右大括號。 '/ [^ {}] +(?=})/ g' – Kash 2012-03-20 18:24:06

0

這個結果:

["{string1}", "string1"] 

是您展示,對於第一場比賽,整個正則表達式匹配"{string1}"和第一捕獲括號匹配"string1"

如果你想獲得的所有比賽,看到每場比賽的所有捕獲的括號,可以使用通過「G」標誌,並且循環中,調用exec()多次這樣的:

var abc = "test/abcd{string1}test{string2}test"; //any string 
var regex = /{(.+?)}/g; 
var match, results = []; 
while (match = regex.exec(abc)) { 
    results.push(match[1]); // save first captured parens sub-match into results array 
} 

// results == ["string1", "string2"] 

你可以看到它在這裏工作:http://jsfiddle.net/jfriend00/sapfm/

+0

作業中的任務...不是我的一杯茶。 – jbabey 2012-03-20 18:18:22

+0

這是一種有效的方式來完成這種類型的循環,並且爲了這個確切的目的而有點常見。除了在這種情況下,我通常會避免它。如果你願意的話,你可以花更多的代碼來完成同樣的事情。 – jfriend00 2012-03-20 18:20:19

+0

感謝您的解釋,我想知道爲什麼相同的字符串出現兩次。謝謝! – 2012-03-20 18:23:09

1

試試這個:

var abc = "test/abcd{string1}test{string2}test" //any string 
var regex = /{(.+?)}/g //g flag so the regex is global 
abc.match(regex) //find every match 

的好地方在javascript閱讀有關正則表達式是here,和一個不錯的PLAC要測試的是here

祝你好運!

+0

我不認爲g會在這裏有所作爲。它沒有得到第二個匹配(string2),因爲它只調用一次exec。 – Kash 2012-03-20 18:14:47

+0

@卡什你是對的,但我叫匹配,沒有克,它會返回'[「{string1}」,「string1」]' – NicoSantangelo 2012-03-20 18:20:20

+0

偉大的正則表達式學習資源,非常感謝你 – 2012-03-20 18:21:27

0

沒有錯。但是,您需要查看捕獲組(數組中的第二個元素)以獲取您想要的內容(您可以忽略第一個內容)。要獲得所有出現的事件,僅運行exec是不夠的,您需要使用match來遍歷結果。

編輯:不要說,afaik你不能訪問捕獲組與match。正如Mike Samuel suggested,更簡單的解決方案是使用積極的預測。

1
var abc = "test/abcd{string1}test{string2}test" //any string 
var regex = /{(.+?)}/g 
var matches; 

while(matches = regex.exec(abc)) 
    console.log(matches); 
相關問題