如果我有一个输入字符串,例如:+key:value+key2:"value+value"+
我想要一个正则表达式,它返回以下形式我:key:value
和key:"value+value"
理想情况下,我想将它包装在一个返回如下对象的函数中:
{
key: 'value',
key2: 'value+value'
}
基本上价值可以是任何东西 - 任何角色。这里唯一的规则实际上是当值内部有一个+号时,这不应该分隔正则表达式操作。
答案 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]
为undefined
,match[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
。