提取多个字符串

时间:2014-05-29 08:51:04

标签: javascript regex

我试图从以下类型的输入中提取多个参数字符串:

  

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执行此操作,但在扩展到更多参数时,这似乎非常冗长。

这样做最有效和最简洁的方法是什么?

5 个答案:

答案 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个参考资料。