【问题标题】:Regexp to replace key, value in brackets正则表达式替换键,括号中的值
【发布时间】:2013-10-22 09:51:58
【问题描述】:

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

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

我的正则表达式技能确实受到限制,我不知道如何做到这一点,是吗?

【问题讨论】:

    标签: javascript regex object string-matching


    【解决方案1】:
    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

    【讨论】:

    • 是的,到目前为止看起来不错...问题是,像 _(foo) 这样的东西不匹配,遗憾的是。
    • @yckart 在这种情况下应该是什么价值?
    • 我希望得到{ foo: 'foo' },就像obj[key] = value || key 分配的那样;)
    • @yckart 更新了我的答案。请立即检查。
    • 是的,我看过了,现在看起来更漂亮了!
    【解决方案2】:

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

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

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

    它应该被用作:

    /[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"}
    

    【讨论】:

    • 太好了,感谢您的回答!问题是像_(foo) 这样的东西不匹配:'(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 2013-03-13
    • 2011-10-26
    • 1970-01-01
    相关资源
    最近更新 更多