Javascript split a string into an array dictionary (key -> value) (regex)

淺唱寂寞╮ 提交于 2020-06-17 03:42:35

问题


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 spliting 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!