--- title: String.prototype.matchAll() slug: Web/JavaScript/Reference/Global_Objects/String/matchAll tags: - JavaScript - Méthode - Prototype - Reference - String translation_of: Web/JavaScript/Reference/Global_Objects/String/matchAll original_slug: Web/JavaScript/Reference/Objets_globaux/String/matchAll ---
La méthode matchAll()
renvoie un itérateur contenant l'ensemble des correspondances entre une chaîne de caractères d'une part et une expression rationnelle d'autre part (y compris les groupes capturants).
Le code source de cet exemple interactif est disponible dans un dépôt GitHub. Si vous souhaitez contribuer à ces exemples, n'hésitez pas à cloner https://github.com/mdn/interactive-examples et à envoyer une pull request !
str.matchAll(regexp)
regexp
new RegExp(obj)
.Un itérateur.
Regexp.exec()
et matchAll()
Avant l'apparition de matchAll()
en JavaScript, il était possible d'utiliser {{jsxref("RegExp.exec")}} (et des expressions rationnelles utilisant le marqueur /g
) dans une boucle afin d'obtenir l'ensemble des correspondances :
const regexp = RegExp('foo*','g'); const str = 'table football, foosball'; while ((matches = regexp.exec(str)) !== null) { console.log(`${matches[0]} trouvé. Prochaine recherche à partir de ${regexp.lastIndex}.`); // dans la console : "foo trouvé. Prochaine recherche à partir de 9." // dans la console : "foo trouvé. Prochaine recherche à partir de 19." }
Avec matchAll()
, on peut éviter la boucle while
et le marqueur global. On récupère l'itérateur et on utilise une boucle for...of
, la décomposition de tableau ou encore {{jsxref("Array.from()")}} :
const regexp = RegExp('foo*','g'); const str = 'table football, foosball'; let matches = str.matchAll(regexp); for (const match of matches) { console.log(match); } // Array [ "foo" ] // Array [ "foo" ] // l'itérateur est épuise après l'itération via for..of // On rappelle matchAll afin de créer un nouvel itérateur matches = str.matchAll(regexp); Array.from(matches, m => m[0]); // Array [ "foo", "foo" ]
Un autre avantage de matchAll()
est un meilleur accès aux groupes capturants. De fait, les groupes capturants sont ignorés par match()
lorsqu'on utilise le marqueur global /g
:
var regexp = /t(e)(st(\d?))/g; var str = 'test1test2'; str.match(regexp); // Array ['test1', 'test2']
Avec matchAll()
, on peut y accéder :
let array = [...str.matchAll(regexp)]; array[0]; // ['test1', 'e', 'st1', '1', index: 0, input: 'test1test2', length: 4] array[1]; // ['test2', 'e', 'st2', '2', index: 5, input: 'test1test2', length: 4]
Spécification | État | Commentaires |
---|---|---|
{{SpecName('ESDraft', '#sec-string.prototype.matchall', 'String.prototype.matchAll')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.builtins.String.matchAll")}}