代码之家  ›  专栏  ›  技术社区  ›  yckart Matthew Crumley

Regexp替换括号中的键和值

  •  0
  • yckart Matthew Crumley  · 技术社区  · 11 年前

    我必须用一些括号的内容来匹配/替换字符串。所以,类似这样的事情:

    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;
    });
    

    我的正则表达式技能真的很有限,我不知道如何做到这一点,是吗?

    2 回复  |  直到 11 年前
        1
  •  3
  •   thefourtheye    11 年前
    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

        2
  •  1
  •   anubhava    11 年前

    首先,这个正则表达式是错误的:

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

    它不会做你认为它正在做的事情,因为它也匹配一个字面上的管道字符。

    应将其用作:

    /[a-z\d]+/g
    

    或者简单地

    /\重量+/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"}