我试图从以下类型的输入中提取多个参数字符串:
var paramsString =“first ='somevalue'second ='other value'third ='another'”
使用生成的对象:
var paramsObject = {
first: 'somevalue',
second: 'another value',
third: 'another'
};
我最初认为我可以做paramsString.split(" ")
但后来我意识到(如上所示)某些值可能有空格。
然后我想也许像RegEx一样:
paramsObject.first = paramsString.match("first='(.*)'")[0];
但是这一直到'
值之后的最后third
个字符。
我可以使用indexOf()
和substring
执行此操作,但在扩展到更多参数时,这似乎非常冗长。
这样做最有效和最简洁的方法是什么?
答案 0 :(得分:2)
您可以尝试这种方法:
var paramString = "first='somevalue' second='another value' third='another'"
paramString.match(/\w+='.*?'/g).reduce(function(prev, curr) {
var parts = curr.split('=');
prev[parts[0]] = parts[1].replace(/(^'|'$)/g, '');
return prev;
}, {});
与/\w+='.*?'/g
regexp匹配后,reduce的强力会将剩余的匹配数组转换为对象。
答案 1 :(得分:1)
你几乎就在那里。但是,你应该记住,你不想捕捉任何东西(。*),而是任何没有表明价值结束的东西,或者'。
/\w+='([^']*)'/g
之类的内容应该符合您的要求(我假设密钥名称不会涉及任何复杂的内容)。有关工作示例,请参阅here。希望有所帮助!
答案 2 :(得分:1)
您可以使用while循环和正则表达式来继续从字符串中检索键/值,并每次删除该字符串的那一部分,直到正则表达式不再匹配。这样的事情应该做你以后的事情;
var paramsString = "first='somevalue' second='another value' third='another'",
paramsObject = {};
while ((matches = /^ ?([^=]+)='([^']+)' ?/.exec(paramsString))) {
paramsString = paramsString.substr(matches[0].length);
paramsObject[matches[1]] = matches[2];
}
答案 3 :(得分:0)
function parse(str) {
var out = {};
str.match(/([^= ]+='[^']+')/g).forEach(function(sub){
var m = sub.match(/([^=]+)='([^']+)/i);
if (m.length === 3) {
out[m[1]] = m[2];
}
}
);
return out;
}
parse("a_1='someValue' a_2='another value' a_3='another'");
比你有:
{
a_1 : "someValue",
a_2 : "another value",
a_3 : "another"
}
答案 4 :(得分:0)
换句话说,使用exec
代替match
。主要优点是exec
返回的对象已经包含了mathed组,没有任何进一步的处理:
var paramsObject = {};
var paramsString = "first='somevalue' second='another value' third='another'";
var re = /(\w+)='([\w ]+)'/gi;
while((ma = re.exec(paramsString)) != null){
paramsObject [ma[1]] = ma[2];
}
有关详细信息,请参阅MDN上的RegExp.exec个参考资料。