Search code examples
javascriptregexregex-grouptaskwarrior

RegEx to extract all matches from string using RegExp.exec


I'm trying to parse the following kind of string:

[key:"val" key2:"val2"]

where there are arbitrary key:"val" pairs inside. I want to grab the key name and the value. For those curious I'm trying to parse the database format of task warrior.

Here is my test string:

[description:"aoeu" uuid:"123sth"]

which is meant to highlight that anything can be in a key or value aside from space, no spaces around the colons, and values are always in double quotes.

In node, this is my output:

[deuteronomy][gatlin][~]$ node
> var re = /^\[(?:(.+?):"(.+?)"\s*)+\]$/g
> re.exec('[description:"aoeu" uuid:"123sth"]');
[ '[description:"aoeu" uuid:"123sth"]',
  'uuid',
  '123sth',
  index: 0,
  input: '[description:"aoeu" uuid:"123sth"]' ]

But description:"aoeu" also matches this pattern. How can I get all matches back?


Solution

  • Continue calling re.exec(s) in a loop to obtain all the matches:

    var re = /\s*([^[:]+):\"([^"]+)"/g;
    var s = '[description:"aoeu" uuid:"123sth"]';
    var m;
    
    do {
        m = re.exec(s);
        if (m) {
            console.log(m[1], m[2]);
        }
    } while (m);
    

    Try it with this JSFiddle: https://jsfiddle.net/7yS2V/