Javascript将字符串拆分为数组字典(key->;value)(regex)
目的是在javascript中将字符串解析到数组字典中 例如,这可能是需要解析的字符串 “k=23:3/24:32b=43:532:45/3:3253”Javascript将字符串拆分为数组字典(key->;value)(regex),javascript,regex,dictionary,pattern-matching,Javascript,Regex,Dictionary,Pattern Matching,目的是在javascript中将字符串解析到数组字典中 例如,这可能是需要解析的字符串 “k=23:3/24:32b=43:532:45/3:3253” 我想把这个字符串变成这样的字典(键值) k-23:3/24:32 b-43:532:45/3:3253 我最初的想法是搜索[a-Z]\*.*并使用正则表达式将其拆分为匹配项 然而,我不认为这会起作用,因为这也会带来b,这不是我想要的。而且,我无法让它工作(我是新的正则表达式) equals将仅在键和变量之间(决不在值中)。密钥也将永远只有
我想把这个字符串变成这样的字典(键值) k-23:3/24:32 b-43:532:45/3:3253
我最初的想法是搜索[a-Z]\*.*并使用正则表达式将其拆分为匹配项 然而,我不认为这会起作用,因为这也会带来b,这不是我想要的。而且,我无法让它工作(我是新的正则表达式)
equals将仅在键和变量之间(决不在值中)。密钥也将永远只有一个字符,而不是一个单词
var test = "k=23:3/24:32b=43:532:45/3:3253";
var r = /(.*)([a-Z])(//*)(*.)/
上面是我的想法,但我似乎无法让任何东西起作用。可能使用
/.=[^=]+(?!=)/g
匹配键值对,而不进一步了解键值可能包含哪些字符:
- 此处
匹配等号前面的键(单个字符)李>=
匹配所有非[^=]+(?!=)
字符,直到下一个等号之前的一个字符(使用负前瞻限制贪婪匹配)或字符串结尾李>=
var test=“k=23:3/24:32b=43:532:45/3:3253”;
var result={}
test.match(/。=[^=]+(?!=)/g).forEach(
m=>{
var[k,v]=m.split('='))
结果[k]=v
}
)
console.log(result)
可能使用/.=[^=]+(?!=)/g
匹配键值对,而无需进一步了解键值可以使用哪些字符:
- 此处
匹配等号前面的键(单个字符)李>=
匹配所有非[^=]+(?!=)
字符,直到下一个等号之前的一个字符(使用负前瞻限制贪婪匹配)或字符串结尾李>=
var test=“k=23:3/24:32b=43:532:45/3:3253”;
var result={}
test.match(/。=[^=]+(?!=)/g).forEach(
m=>{
var[k,v]=m.split('='))
结果[k]=v
}
)
console.log(result)
由于标识符只有一个字符,并且=
是标识符结束和值开始的地方,因此只需使用类似以下的正则表达式即可:
var r = /.=.+?(?=(.=)|$)/g;
这意味着:
. : a character
= : followed by =
.+? : followed by a bunch of characters (the ? means non-greedy mode: match as few as possible so that it won't consume from other variables)
(?=(.=)|$) : positive look-ahead, means that the above should be followed either by another .= (a character that is followed by =) or the end of the string
然后,您可以通过对每个匹配进行split
ing以获得键值对,从而reduce
匹配以获得所需的对象:
var obj = test.match(r).reduce(function(obj, match) {
var keyValue = match.split("=");
obj[keyValue[0]] = keyValue[1];
return obj;
}, {});
示例:
var test=“k=23:3/24:32b=43:532:45/3:3253”;
var r=/.=.+(?=(.=)|$)/g;
var obj=test.match(r).reduce(函数(obj,match){
var keyValue=match.split(“”);
obj[keyValue[0]]=keyValue[1];
返回obj;
}, {});
控制台日志(obj)代码>由于标识符只有一个字符,=
是标识符结束和值开始的地方,因此只需使用类似以下的正则表达式即可:
var r = /.=.+?(?=(.=)|$)/g;
这意味着:
. : a character
= : followed by =
.+? : followed by a bunch of characters (the ? means non-greedy mode: match as few as possible so that it won't consume from other variables)
(?=(.=)|$) : positive look-ahead, means that the above should be followed either by another .= (a character that is followed by =) or the end of the string
然后,您可以通过对每个匹配进行split
ing以获得键值对,从而reduce
匹配以获得所需的对象:
var obj = test.match(r).reduce(function(obj, match) {
var keyValue = match.split("=");
obj[keyValue[0]] = keyValue[1];
return obj;
}, {});
示例:
var test=“k=23:3/24:32b=43:532:45/3:3253”;
var r=/.=.+(?=(.=)|$)/g;
var obj=test.match(r).reduce(函数(obj,match){
var keyValue=match.split(“”);
obj[keyValue[0]]=keyValue[1];
返回obj;
}, {});
控制台日志(obj)代码>如果值的格式也定义得很好,则可以生成更干净的正则表达式。看起来值总是(数字):(数字)/(数字):(数字)
——是这样吗?如果值的格式也定义得很好,则可以生成更干净的正则表达式。看起来值总是(数字):(数字)/(数字):(数字)
--是这样吗?您的意思是您有*
作为键值对的分隔符吗?如果是这种情况,请尝试/.\*[^*]+(?!\*)/g
,注意您需要转义*
,因为它是正则表达式中的量词。您的意思是将*
作为键值对的分隔符吗?如果是这种情况,请尝试/.\*[^*]+(?!\*)/g
,注意您需要转义*
,因为它是正则表达式中的量词。