Comment accéder aux groupes capturés dans une expression régulière JavaScript ?
Fondamentaux du travail avec les groupes de capture en JavaScript
Dans les expressions régulières, les groupes de capture sont créés à l'aide de parenthèses. Dans votre code, le motif /(\d{2})\.(\d{2})\.(\d{4})/ contient exactement trois groupes de capture : un pour le jour, un pour le mois et un pour l'année.
Méthodes exec() et match()
regex.exec(str) renvoie une correspondance complète et des groupes de capture, même si le drapeau g (global) est utilisé. str.match(regex) sans le drapeau g fonctionne de manière similaire, mais avec le drapeau g, il renvoie un tableau de toutes les correspondances completes.
Votre utilisation de result[1], result[2], result[3] est tout à fait correcte. Pour que ce soit plus pratique, vous pouvez utiliser la déstructuration :
Groupes nommés (ES2018+)
Oui, vous pouvez nommer les groupes de capture. La syntaxe est (?. Exemple :
Quand utiliser exec() vs match() ?
- Utilisez
exec()lorsque vous avez besoin d'accéder aux groupes de capture dans des boucles ou lorsque vous travaillez avec le drapeaug. - Utilisez
str.match(regex)sans le drapeaugpour une extraction unique des groupes (il se comporte commeexec()). - Utilisez
str.match(regex)avec le drapeaugsi vous avez seulement besoin de toutes les correspondances complètes, sans groupes.
Différence importante avec match() en l'absence de correspondance
str.match(regex) renvoie null s'il n'y a pas de correspondance, tandis que regex.exec(str) renvoie également null. Mais si vous utilisez match() sans drapeau g, en l'absence de correspondance, le résultat est null, tandis qu'un tableau vide n'est renvoyé qu'avec le drapeau g et l'absence de correspondance. Vérifiez donc soigneusement le résultat.
Exemple complet
let str = "Сегодня 25.12.2023";
let regex = /(?<day>\d{2})\.(?<month>\d{2})\.(?<year>\d{4})/;
let match = str.match(regex);
if (match) {
let { day, month, year } = match.groups;
console.log(`Jour : ${day}, Mois : ${month}, Année : ${year}`);
} else {
console.log("Aucune correspondance");
}