正则表达式:如何从'+键:值+键2:“值+值”+'中提取键和值?

时间:2013-04-10 14:57:32

标签: javascript regex

如果我有一个输入字符串,例如:+key:value+key2:"value+value"+我想要一个正则表达式,它返回以下形式我:key:valuekey:"value+value"

理想情况下,我想将它包装在一个返回如下对象的函数中:

{
  key: 'value',
  key2: 'value+value'
}

基本上价值可以是任何东西 - 任何角色。这里唯一的规则实际上是当值内部有一个+号时,这不应该分隔正则表达式操作。

2 个答案:

答案 0 :(得分:3)

function parseRagulkasString(str) {
    var regex = /\+([^:]+):((?!")[^+]*|"([^"]*)")/g, o = {}, match;
    while ((match = regex.exec(str)) !== null)
        o[match[1]] = match[match[3] === undefined ? 2 : 3];
    return o;
}

演示:http://jsfiddle.net/NRhST/2/

解释

  • \+匹配文字加号。
  • ([^:]+)匹配任何非:个符号,并被捕获为第一组。
  • :匹配字面冒号。
  • ( ... )捕获第二组:
    • (?!")[^+]*如果没有引号,则匹配所有连续的非加号字符。
    • |否则
    • "([^"]*)"匹配引号内的所有非引号字符,并捕获此组(3)。

while循环重复运行输入字符串的正则表达式,并按如下方式处理所有匹配:

  • match[1]是第一个捕获的组,用作密钥。
  • 如果未引用该值,则match[3]undefinedmatch[2]为该值。
  • 否则,match[3]包含引号内的内容,match[2]包含内容,包括引号。

例如(+key:value+key2:"value+value"+):

match[0] = 'key:value'   match[0] = 'key2:"value+value"'
match[1] = 'key'         match[1] = 'key2'
match[2] = 'value'       match[2] = '"value+value"'
match[3] = undefined     match[3] = 'value+value'

由于match[2]仅在未引用该值时才有意义,因此我们首先检查match[3]是否为undefined。如果是,则不引用该值,我们使用第二组。否则,使用第三组。

注意:此实现需要问题中指定的格式(最后一个加号是可选的)。您可以使用以下命令验证输入字符串是否与预期格式匹配:

function isRagulkasString(str) {
    return /^(\+[^:]+:((?!")[^+]*|"[^"]*"))+\+?$/.test(str);
}

答案 1 :(得分:1)

使用正则表达式并不是最简单的解决方案。

这是一个解决方案:

var str = '+key:value+key2:"value+value"+';
var o = {};
str.split('"').map(function(v,i){
  return i%2 ? v.replace(/\+/, 'ù') : v
}).join('').split('+').forEach(function(v){
  var t = v.split(':');
  if (t.length==2) o[t[0]]=t[1].replace(/ù/,'+');
});
console.log(o);

假设你的字符串中没有ù。如果可能是这种情况,则可能会调整代码以使用另一个(更长的)分隔符。

Demonstration(打开控制台)

请注意,如果您想与IE8兼容,则必须使用for循环而不是forEach