问题
The aim is to parse a string into an array dictionary in javascript.
For example this maybe the string that needs to be parsed
"k=23:3/24:32b=43:532:45/3:3253"
I would like that string to turn into a dictionary like so (Key - Value)
k - 23:3/24:32
b - 43:532:45/3:3253
My initial idea was to search for [a-Z]\*.* and split it into matches using regex.
However, I do not think this would work as this would also bring over b which is not what I want. Also, I was not able to get this to work (I'm new to regex).
An equals will only ever be between a key and variable (never in the value). The key will also only ever be a single character not a word.
var test = "k=23:3/24:32b=43:532:45/3:3253";
var r = /(.*)([a-Z])(//*)(*.)/
Above was my idea of going about it but I can not seem to get anything to work.
回答1:
Possibly use /.=[^=]+(?!=)/g
to match the key value pair without further knowledge of what characters are possible for the key and value:
- Here
.=
matches the key (single character) right before the equal sign; [^=]+(?!=)
matches all non=
characters after until one character before the next equal sign (restrict the greedy match using a negative look ahead) or the end of string;
var test = "k=23:3/24:32b=43:532:45/3:3253";
var result = {}
test.match(/.=[^=]+(?!=)/g).forEach(
m => {
var [k, v] = m.split('=')
result[k] = v
}
)
console.log(result)
回答2:
Since the identifier is only one character and the =
is where the identifier ends and the value begins, then just do that using a regex like:
var r = /.=.+?(?=(.=)|$)/g;
Which means:
. : 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
Then you can reduce
the matches to get your desired object, by split
ing each match to get the key-value pairs:
var obj = test.match(r).reduce(function(obj, match) {
var keyValue = match.split("=");
obj[keyValue[0]] = keyValue[1];
return obj;
}, {});
Example:
var test = "k=23:3/24:32b=43:532:45/3:3253";
var r = /.=.+?(?=(.=)|$)/g;
var obj = test.match(r).reduce(function(obj, match) {
var keyValue = match.split("=");
obj[keyValue[0]] = keyValue[1];
return obj;
}, {});
console.log(obj);
来源:https://stackoverflow.com/questions/50124987/javascript-split-a-string-into-an-array-dictionary-key-value-regex