2013-10-22 101 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