Javascript regex capture plusieurs fois

D'accord, je pense qu'il faut reposer ma question à l'origine:

Virtual Regex multiple du groupe

Avec un exemple complet. J'ai:

var text = ""+ "<html> " + " <head> " + " </head> " + " <body> " + " <g:alert content='alert'/> " + " <g:alert content='poop'/> " + " </body> " + "</html>"; var regex = /<([a-zA-Z]*?):([a-zA-Z]*?)\s([\s\S]*?)>/m; var match = regex.exec( text ); console.log(match) 

La sortie de console.log est:

Sortie de console.log

Le problème est que je n'obtiens que le résultat pour le premier … pas l'autre … que puis-je faire pour pouvoir capturer et parcourir toutes les choses qui correspondent?

exec renvoie un seul résultat à la fois et définit le pointeur jusqu'à la fin de cette correspondance. Par conséquent, si vous souhaitez obtenir TOUTES les allumettes, utilisez une boucle while:

 while ((match = regex.exec( text )) != null) { console.log(match); } 

Pour obtenir tous les matches d'un seul coup, utilisez text.match(regex) , dans lequel le regex a spécifié g (flag global). Le drapeau g fera match trouver toutes les correspondances au regex dans la chaîne et renvoyer toutes les correspondances dans un tableau.

[Edit] et c'est pourquoi mon exemple HAD ag flag set! [/ Eoe]

 var text = ""+ "<html> " + " <head> " + " </head> " + " <body> " + " <g:alert content='alert'/> " + " <g:alert content='poop'/> " + " </body> " + "</html>"; // Note the g flag var regex = /<([a-zA-Z]*?):([a-zA-Z]*?)\s([\s\S]*?)>/gm; var match = text.match( regex ); console.log(match); 

TEST SIMPLE:

 <button onclick="myFunction()">Try it</button> <script> function myFunction() { var text = ""+ "<html> " + " <head> " + " </head> " + " <body> " + " <g:alert content='alert'/> " + " <g:alert content='poop'/> " + " </body> " + "</html>"; // Note the g flag var regex = /<([a-zA-Z]*?):([a-zA-Z]*?)\s([\s\S]*?)>/gi; var n = text.match( regex ); alert(n); } </script> 

Fonctionne parfaitement …

C'est ce qui fonctionne:

  var text = ""+ "<html> " + " <head> " + " </head> " + " <body> " + " <g:alert content='alert'/> " + " <g:alert content='poop'/> " + " </body> " + "</html>"; var regex = /<([a-zA-Z]*?):([a-zA-Z]*?)\s([\s\S]*?)>/g; var match = null; while ( (match = regex.exec( text )) != null ) console.log(match) 

Notez le / g qui semble être nécessaire