2013-10-22 130 views
0

我必須通過一些括號內容匹配/替換字符串。所以,這樣的事情:正則表達式來替換關鍵字,括號中的值

var str = '_(foo, bar)' 

應該導致這樣一個對象:

var obj = {foo: 'bar'} 

我用這個正則表達式/[a-z]+/g嘗試過,但沒有成功!

我需要的是這樣的功能:

var obj = {}; 
'_(foo, bar)'.replace(/[a-z]+/g, function (match, key, value) { 
    obj[key] = value || key; 
}); 

我正則表達式的能力真的限制,我不知道如何做到這一點,你呢?

回答

3
var obj = {}; 
'_(foo)'.replace(/\(([a-z\d]+),*\s*([a-z\d]+)*\)/g, function (match, key, value){ 
    obj[key] = value || key; 
});  
console.log(obj); 

輸出

{ foo: 'foo' } 

你可以看到解釋這裏的正則表達式http://regex101.com/r/jG1sY6

+0

是啊,看起來好爲止。 ..問題是,像'_(foo)'這樣的東西不合適,可悲。 – yckart

+0

@yckart在這種情況下應該是什麼值? – thefourtheye

+0

我希望得到'{foo:'foo'}',因爲'obj [key] = value ||鍵'分配;) – yckart

1

首先這個表達式是錯誤的:

/[a-z|\d]+/g 

它不會做什麼你認爲這是因爲它匹配文人l管道人物也。

它應該被用來作爲:

/[a-z\d]+/g 

或者乾脆

/\ w +/g的

你的代碼可以是:

str = '_(foo)'; 
obj = {}; 
str.replace(/([a-z\d]+)(?:\s*,\s*([a-z\d]+))?/, function (m, k, v) { 
     obj[k] = v||k; return m }); 

console.log(obj); // Object {foo: "foo"} 
+0

偉大的,感謝您的答案!問題是類似'_(foo)'的東西不匹配:'( – yckart

+0

請檢查編輯現在,它應該現在匹配 – anubhava

+0

+1真棒!你明白了:) – yckart