2

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
  • 1
    If the format of the value is also well defined it can make a cleaner regex. It looks like the value is always (digits):(digits)/(digits):(digits) -- is that the case? Commented May 1, 2018 at 23:16

2 Answers 2

5

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)

Sign up to request clarification or add additional context in comments.

1 Comment

Do you mean you have * as separator for key value pairs? If that's the case, try /.\*[^*]+(?!\*)/g, notice you need to escape * as it's a quantifier in regex.
0

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);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.