--- title: RegExp.prototype.exec() slug: Web/JavaScript/Reference/Global_Objects/RegExp/exec tags: - JavaScript - Méthode - Prototype - Reference - RegExp translation_of: Web/JavaScript/Reference/Global_Objects/RegExp/exec original_slug: Web/JavaScript/Reference/Objets_globaux/RegExp/exec ---
La méthode exec()
exécute la recherche d'une correspondance sur une chaîne de caractères donnée. Elle renvoie un tableau contenant les résultats ou {{jsxref("null")}}.
Si on souhaite uniquement savoir s'il y a une correspondance, on utilisera la méthode {{jsxref("RegExp.prototype.test()")}} ou la méthode {{jsxref("String.prototype.search()")}}.
Le code source de cet exemple interactif est disponible dans un dépôt GitHub. Si vous souhaitez contribuez à ces exemples, n'hésitez pas à cloner https://github.com/mdn/interactive-examples et à envoyer une pull request !
Les objets représentant des expressions rationnelles gardent un état en mémoire lorsqu'ils utilisent les marqueurs {{jsxref("RegExp.global", "global")}} ou {{jsxref("RegExp.sticky", "sticky")}} et ils gardent notamment en mémoire {{jsxref("RegExp.lastIndex", "lastIndex")}} à partir de la correspondance précédemment trouvée. Ainsi, exec()
peut être utilisée afin de parcourir plusieurs correspondances dans un texte (avec des groupes capturants) (contrairement à {{jsxref("String.prototype.match()")}}).
regexObj.exec(chaîne)
chaîne
S'il y a une correspondance, la méthode exec()
renvoie un tableau (contenant des éléments et deux propriétés index
et values
, cf. ci-après) et met à jour les propriétés de l'objet représentant l'expression rationnelle (notamment {{jsxref("RegExp.lastIndex", "lastIndex")}}). Le tableau renvoyé contient le texte qui correspond dans le premier élément puis un élément pour chaque groupe capturé dans les parenthèses capturantes.
S'il n'y a aucune correspondance, la méthode exec()
renvoie {{jsxref("null")}} et la propriété {{jsxref("RegExp.lastIndex", "lastIndex")}} reçoit la valeur 0.
Si on a l'exemple suivant :
// On a une correspondance si on a "quick brown" suivi par "jumps", on ignore les caractères entre // On garde en mémoire "brown" et "jumps" // On ignore la casse var re = /quick\s(brown).+?(jumps)/ig; var result = re.exec('The Quick Brown Fox Jumps Over The Lazy Dog');
Le tableau suivant montre l'état résultant suite à ce script :
Objet | Propriété/Index | Description | Exemple |
result |
[0] |
La chaîne complète des caractères qui correspondent. | "Quick Brown Fox Jumps" |
[1], ...[n ] |
Les sous-chaînes correspondantes aux groupes capturants s'il y en a. Le nombre de groupes de parenthèses capturantes est illimité. | result[1] === "Brown" |
|
index |
L'indice (compté à partir de 0) de la correspondance dans la chaîne. | 4 |
|
input |
La chaîne de caractères utilisée en entrée. | "The Quick Brown Fox Jumps Over The Lazy Dog" |
|
re |
lastIndex |
L'indice à partir duquel chercher la prochaine correspondance. Lorsque le drapeau "g" est absent, cette propriété sera 0. | 25 |
ignoreCase |
Indique si le drapeau "i " a été utilisé pour ignorer la casse. |
true |
|
global |
Indique si le drapeau "g " a été utilisé pour la correspondance globale. |
true |
|
multiline |
Indique si le drapeau "m " a été utilisé pour chercher une correspondance sur plusieurs lignes. |
false |
|
source |
Le texte du motif. | "quick\s(brown).+?(jumps)" |
Si on utilise le drapeau "g
" dans l'expression rationnelle, on peut utiliser la méthode exec()
plusieurs fois afin de trouver les correspondances successives dans la chaîne. Lorsqu'on procède ainsi, la recherche reprend à la position indiquée par la propriété {{jsxref("RegExp.lastIndex", "lastIndex")}} ({{jsxref("RegExp.prototype.test()", "test()")}} fera également progresser la propriété {{jsxref("RegExp.lastIndex", "lastIndex")}}).
On notera que la propriété {{jsxref("RegExp.lastIndex", "lastIndex")}} ne sera pas réinitialisée lors de la recherche sur une autre chaîne de caractères, c'est la valeur existante de {{jsxref("RegExp.lastIndex", "lastIndex")}} qui sera utilisée.
Par exemple, si on utilise le fragment de code suivant :
var maRegex = /ab*/g; var str = 'abbcdefabh'; var monTableau; while ((monTableau = maRegex.exec(str)) !== null) { var msg = 'Trouvé ' + monTableau[0] + '. '; msg += 'Prochaine correspondance à partir de ' + maRegex.lastIndex; console.log(msg); }
Le script affichera alors :
Trouvé abb. Prochaine correspondance à partir de 3 Trouvé ab. Prochaine correspondance à partir de 9
Attention à ne pas placer un littéral d'expression rationnelle (ou le constructeur {{jsxref("RegExp")}}) au sein de la condition while
car cela créerait un boucle infinie s'il y a une correspondance car la propriété {{jsxref("RegExp.lastIndex", "lastIndex")}} serait redéfinie à chaque itération. Il faut également s'assurer que le drapeau global est défini sinon on aura également une boucle.
exec()
avec des littérauxIl est aussi possible d'utiliser exec()
sans créer d'objet {{jsxref("RegExp")}} explicite :
var matches = /(coucou \S+)/.exec('Ceci est un coucou monde !'); console.log(matches[1]);
Cela affichera 'coucou monde !'.
Spécification | État | Commentaires |
---|---|---|
{{SpecName('ES3')}} | {{Spec2('ES3')}} | Définition initiale. Implémentée avec JavaScript 1.2. |
{{SpecName('ES5.1', '#sec-15.10.6.21', 'RegExp.exec')}} | {{Spec2('ES5.1')}} | |
{{SpecName('ES6', '#sec-regexp.prototype.exec', 'RegExp.exec')}} | {{Spec2('ES6')}} | |
{{SpecName('ESDraft', '#sec-regexp.prototype.exec', 'RegExp.exec')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.builtins.RegExp.exec")}}