RegEx to extract all matches from string using RegExp.exec

前端 未结 17 1138
-上瘾入骨i
-上瘾入骨i 2020-11-22 02:49

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

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

where there are arbitrary key:\"val\" pairs inside. I want t

相关标签:
17条回答
  • 2020-11-22 03:23
    str.match(/regex/g)
    

    returns all matches as an array.

    If, for some mysterious reason, you need the additional information comes with exec, as an alternative to previous answers, you could do it with a recursive function instead of a loop as follows (which also looks cooler).

    function findMatches(regex, str, matches = []) {
       const res = regex.exec(str)
       res && matches.push(res) && findMatches(regex, str, matches)
       return matches
    }
    
    // Usage
    const matches = findMatches(/regex/g, str)
    

    as stated in the comments before, it's important to have g at the end of regex definition to move the pointer forward in each execution.

    0 讨论(0)
  • 2020-11-22 03:26

    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/

    0 讨论(0)
  • 2020-11-22 03:26

    str.match(pattern), if pattern has the global flag g, will return all the matches as an array.

    For example:

    const str = 'All of us except @Emran, @Raju and @Noman was there';
    console.log(
      str.match(/@\w*/g)
    );
    // Will log ["@Emran", "@Raju", "@Noman"]

    0 讨论(0)
  • 2020-11-22 03:27

    Here is my function to get the matches :

    function getAllMatches(regex, text) {
        if (regex.constructor !== RegExp) {
            throw new Error('not RegExp');
        }
    
        var res = [];
        var match = null;
    
        if (regex.global) {
            while (match = regex.exec(text)) {
                res.push(match);
            }
        }
        else {
            if (match = regex.exec(text)) {
                res.push(match);
            }
        }
    
        return res;
    }
    
    // Example:
    
    var regex = /abc|def|ghi/g;
    var res = getAllMatches(regex, 'abcdefghi');
    
    res.forEach(function (item) {
        console.log(item[0]);
    });
    
    0 讨论(0)
  • 2020-11-22 03:27

    This isn't really going to help with your more complex issue but I'm posting this anyway because it is a simple solution for people that aren't doing a global search like you are.

    I've simplified the regex in the answer to be clearer (this is not a solution to your exact problem).

    var re = /^(.+?):"(.+)"$/
    var regExResult = re.exec('description:"aoeu"');
    var purifiedResult = purify_regex(regExResult);
    
    // We only want the group matches in the array
    function purify_regex(reResult){
    
      // Removes the Regex specific values and clones the array to prevent mutation
      let purifiedArray = [...reResult];
    
      // Removes the full match value at position 0
      purifiedArray.shift();
    
      // Returns a pure array without mutating the original regex result
      return purifiedArray;
    }
    
    // purifiedResult= ["description", "aoeu"]
    

    That looks more verbose than it is because of the comments, this is what it looks like without comments

    var re = /^(.+?):"(.+)"$/
    var regExResult = re.exec('description:"aoeu"');
    var purifiedResult = purify_regex(regExResult);
    
    function purify_regex(reResult){
      let purifiedArray = [...reResult];
      purifiedArray.shift();
      return purifiedArray;
    }
    

    Note that any groups that do not match will be listed in the array as undefined values.

    This solution uses the ES6 spread operator to purify the array of regex specific values. You will need to run your code through Babel if you want IE11 support.

    0 讨论(0)
提交回复
热议问题