Groupes capturants
Apprenez les groupes capturants en JavaScript : groupes numérotés, nommés (?<nom>), non-capturants (?:), et leur utilisation avec match, matchAll et replace ($1, $<nom>).
Un groupe capturant est une partie d'une expression régulière entourée de parenthèses (...). Il remplit deux fonctions : il regroupe un fragment du motif pour que les quantificateurs et l'alternance s'appliquent à l'ensemble, et il mémorise le texte qui a correspondu afin que vous puissiez le relire ensuite.
C'est ce qui transforme une expression régulière d'un simple test oui/non en un outil d'extraction de données. Au lieu de savoir seulement qu'une date a correspondu, vous pouvez extraire l'année, le mois et le jour comme pièces distinctes. Cette page couvre les groupes numérotés, les groupes nommés, les groupes non-capturants, et le comportement des groupes avec match, matchAll et replace.
Comprendre les groupes capturants
Lorsqu'une correspondance est trouvée, la correspondance complète est stockée à l'index 0 du tableau résultat, et chaque groupe capturant est stocké aux index suivants (1, 2, 3, …) dans l'ordre d'apparition des parenthèses ouvrantes, de gauche à droite.
Syntaxe et utilisation de base
Voici un exemple simple :
match[0] est toujours la chaîne entière correspondante. match[1] et match[2] contiennent le texte capturé par le premier et le deuxième jeu de parenthèses. Les groupes sont numérotés par leur ( ouvrante, de sorte que même les groupes imbriqués ont un ordre prévisible (voir ci-dessous).
Utilisation avancée et techniques
Groupes capturants imbriqués
Les groupes peuvent être imbriqués, permettant des correspondances de motifs plus complexes. La numérotation suit chaque parenthèse ouvrante de gauche à droite :
Le groupe externe (groupe 1) capture foobar, tandis que les groupes internes (2 et 3) capturent foo et bar séparément. Si un groupe est optionnel et ne participe pas à la correspondance, son emplacement vaut undefined.
Groupes non-capturants
Parfois, vous souhaitez regrouper des parties d'un motif — pour appliquer un quantificateur ou une alternance — sans utiliser un emplacement numéroté. Les groupes non-capturants utilisent (?:...) :
Ici, foo est regroupé mais non capturé, donc bar devient le groupe 1 au lieu du groupe 2. Les groupes non-capturants gardent votre tableau résultat propre et sont légèrement plus rapides lorsque vous n'avez pas besoin du texte correspondant.
Un usage courant est de répéter un fragment sans capturer chaque répétition :
Exemples pratiques
Analyser des dates
Les groupes capturants peuvent analyser et reformater des dates issues de chaînes :
Ce code extrait l'année, le mois et le jour, puis formate la date dans un style différent.
Extraire des informations depuis des URL
Un autre cas d'usage courant est l'extraction de parties d'une URL :
Cette expression régulière capture séparément le protocole, le domaine, le chemin et la chaîne de requête.
Conseils pour utiliser efficacement les groupes capturants
- Planifiez vos groupes : Réfléchissez à l'avance aux parties du motif que vous devez capturer.
- Utilisez les groupes non-capturants si nécessaire : Utilisez
(?:...)pour regrouper sans capturer, afin de simplifier votre tableau de correspondances. - Groupes capturants nommés : En JavaScript moderne (ES2018+), vous pouvez utiliser des groupes capturants nommés pour une meilleure lisibilité.
- Comportement avec le drapeau global : Lorsque vous utilisez le drapeau
gavecString.prototype.match(), celui-ci renvoie un tableau de toutes les chaînes correspondantes au lieu des groupes capturants. UtilisezString.prototype.matchAll()pour une extraction détaillée des groupes avec le drapeau global.
Groupes capturants nommés
Les groupes numérotés sont fragiles : ajoutez un groupe au milieu et chaque index qui suit se décale. Les groupes capturants nommés (ES2018+) évitent cela en étiquetant chaque groupe avec (?<nom>...). Les captures apparaissent sur un objet groups au lieu de (ou en plus des) index numérotés :
Préférez les groupes capturants nommés pour tout motif non trivial — ils rendent à la fois l'expression régulière et le code qui la lit auto-documentés.
Utiliser les groupes avec match, matchAll et replace
La manière de lire les groupes capturés dépend de la méthode que vous appelez.
Sans le drapeau g — match renvoie les groupes
Un String.prototype.match() non global renvoie un seul tableau de correspondance avec tous les groupes, exactement comme dans les exemples ci-dessus. C'est la façon la plus courante d'extraire un seul enregistrement.
Avec le drapeau g — utilisez matchAll pour les groupes
Lorsque vous ajoutez le drapeau global g, match() ne renvoie qu'un tableau plat de chaînes de correspondance complètes — les groupes sont perdus. Pour obtenir les groupes de chaque correspondance, utilisez String.prototype.matchAll(), qui renvoie un itérateur de tableaux de correspondance (chacun avec son propre objet groups) :
Référencer les groupes dans replace
Dans une chaîne de remplacement String.prototype.replace(), vous pouvez référencer les captures par numéro avec $1, $2, … ou par nom avec $<nom> :
Pour plus de contrôle, passez une fonction à replace. Ses arguments sont la correspondance complète, puis chaque groupe capturé, et (si vous avez utilisé des noms) un objet groups final :
Références arrière
Une fois qu'un groupe a capturé du texte, vous pouvez retrouver ce même texte plus loin dans le même motif grâce à une référence arrière — \\1 pour les groupes numérotés ou \\k<nom> pour les groupes nommés. C'est utile pour trouver des mots répétés ou faire correspondre des guillemets appariés :
Les références arrière constituent un sujet à part entière — voir Références arrière dans un motif pour tous les détails.
Sujets connexes
- Alternance (OU)
|— les groupes sont essentiels pour délimiter l'alternance. - Quantificateurs
+ * ? {n}— appliquez la répétition à un groupe entier. - Quantificateurs avides et paresseux — contrôlez combien un groupe consomme.
- Références arrière
\1et\k<name>— réutilisez le texte capturé dans un motif. - Motifs et drapeaux — les drapeaux
g,iet autres qui affectent la correspondance.
Conclusion
Les groupes capturants dans les expressions régulières JavaScript offrent une manière robuste de travailler avec des motifs de chaînes complexes. En maîtrisant leur utilisation, vous pouvez effectuer des manipulations de texte sophistiquées, extraire des données significatives et gérer les remplacements avec facilité. Que vous analysiez des dates, traitiez des URL ou reformatiez des chaînes, les groupes capturants fournissent la flexibilité et la puissance nécessaires pour les tâches avancées de traitement de texte. Explorez ces exemples, entraînez-vous avec vos propres motifs, et développez vos compétences JavaScript pour relever tout défi de manipulation de chaînes.