Bonjour à tous,

Vous connaissez les groupes capturants des RegExps...

Il y a plusieurs méthodes pour les récupérer mais toutes ne sont pas bonnes. En effet, vous pourriez avoir de bien mauvaises surprises !


La pratique courante (utilisation du résultat en tant qu'Array) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
var matches;
matches = '123'.match(/^(.)(.)(.)$/); // ['123','1','2','3']
Ce n'est pas très pratique, car vous allez devoir parcourir ce tableau et cela n'est pas top en termes de lisibilité.


L'exemple à ne surtout pas faire ! (utilisation de propriétés statiques du constructeur RegExp) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
var fct1, fct2;
fct1 = function fct1(str) {
    str.match(/^(.*)$/);
    fct2('def');
    return RegExp.$1;
};
fct2 = function fct2(str) {
    str.match(/^(.*)$/);
};
fct1('abc'); // def, au lieu de abc
Que s'est-il passé? C'est assez simple, les propriétés RegExp.$n, étant statiques, seul le dernier résultat ayant correspondu au masque est mis en mémoire.


La solution la plus lisible et pratique à manipuler (utilisation de labels) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
var str;
str = '123';
str.replace(/^(.)(.)(.)$/, function(source, label1, label2, label3) {
	// traitez ici vos groupes nommés
});