How to loop all the elements that match the regex?

JavascriptRegex

Javascript Problem Overview


Here is the case: I want to find the elements which match the regex...

> targetText = "SomeT1extSomeT2extSomeT3extSomeT4extSomeT5extSomeT6ext"

and I use the regex in javascript like this

reg = new RegExp(/e(.*?)e/g);   
var result = reg.exec(targetText);

and I only get the first one, but not the follow.... I can get the T1 only, but not T2, T3 ... ...

Javascript Solutions


Solution 1 - Javascript

var reg = /e(.*?)e/g;
var result;
while((result = reg.exec(targetText)) !== null) {
    doSomethingWith(result);
}

Solution 2 - Javascript

Three approaches depending on what you want to do with it:

  • Loop through each match: .match

     targetText.match(/e(.*?)e/g).forEach((element) => {
        // Do something with each element
     });
    
  • Loop through and replace each match on the fly: .replace

     const newTargetText = targetText.replace(/e(.*?)e/g, (match, $1) => {
       // Return the replacement leveraging the parameters.
     });
    
  • Loop through and do something on the fly: .exec

     const regex = /e(.*?)e/g;  // Must be declared outside the while expression, 
                                // and must include the global "g" flag.
     
     let result;
     while(result = regex.exec(targetText)) {
       // Do something with result[0].
     } 
    

Solution 3 - Javascript

Try using match() on the string instead of exec(), though you could loop with exec as well. Match should give you the all the matches at one go. I think you can omit the global specifier as well.

reg = new RegExp(/e(.*?)e/);   
var matches = targetText.match(reg);

Solution 4 - Javascript

I kept getting infinite loops while following the advice above, for example:

var reg = /e(.*?)e/g;
var result;
while((result = reg.exec(targetText)) !== null) {
    doSomethingWith(result);
}

The object that was assigned to result each time was:

["", "", index: 50, input: "target text", groups: undefined]

So in my case I edited the above code to:

const reg = /e(.*?)e/g;
let result = reg.exec(targetText);
while(result[0] !== "") {
    doSomethingWith(result);
    result = reg.exec(targetText);
}

Solution 5 - Javascript

targetText = "SomeT1extSomeT2extSomeT3extSomeT4extSomeT5extSomeT6ext"    
reg = new RegExp(/e(.*?)e/g);   
var result;
while (result = reg.exec(targetText))
{
    ...
}

Solution 6 - Javascript

You could also use the String.replace method to loop through all elements.

result = [];
 // Just get all numbers
"SomeT1extSomeT2extSomeT3ext".replace(/(\d+?)/g, function(wholeMatch, num) {
  // act here or after the loop...
  console.log(result.push(num));
  return wholeMatch;
});
console.log(result); // ['1', '2', '3']

Greetings

Solution 7 - Javascript

I did this in a console session (Chrome).

> let reg = /[aeiou]/g;
undefined
> let text = "autoeciously";
undefined
> matches = text.matches(reg);
(7) ["a", "u", "o", "e", "i", "o", "u"]
> matches.forEach(x =>console.log(x));
a
u
o
e
i
o
u

Solution 8 - Javascript

I was actually dealing with this issue. I prefer Lambda functions for about everything.

reg = /e(.*?)e/gm;   
targetText.match(reg).forEach(element => console.log(element));

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDNB5brimsView Question on Stackoverflow
Solution 1 - JavascriptchaosView Answer on Stackoverflow
Solution 2 - JavascriptModularView Answer on Stackoverflow
Solution 3 - JavascripttvanfossonView Answer on Stackoverflow
Solution 4 - JavascriptAsher GarlandView Answer on Stackoverflow
Solution 5 - Javascriptport-zeroView Answer on Stackoverflow
Solution 6 - JavascriptChristopherView Answer on Stackoverflow
Solution 7 - JavascriptncmathsadistView Answer on Stackoverflow
Solution 8 - JavascriptGetBackerZView Answer on Stackoverflow