Expressions régulières : capture de groupes

cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008 - 18 août 2006 à 12:36
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008 - 18 août 2006 à 17:34
Bonjour, je souhaiterais capturer plusieurs groupes emboités les uns dans les autres dans une chaine de caractère à l'aide d'une expression régulière.

Voici un exemple :
            string exemplaire = "aaaaaaab";
            Regex reg = new Regex("a*b");
            MatchCollection Mcol = reg.Matches(exemplaire);

Je souhaiterais obtenir les groupes suivants :
b ;
ab ;
aab ;
aaab ;
aaaab ;
...

Malheureusement je n'obtiens que le groupe le plus grand, c'est à dire "aaaaaaab".
Je voulais donc savoir si il existe une solution pour capturer tous ces groupes ?

merci d'avance

Mathmax

2 réponses

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 36
18 août 2006 à 16:40
la solution serait de mettre un ? après ton * pour qu'il s'arrête à la première occurence... mais j'ai un doute...

essaye toujours : a*?b

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
18 août 2006 à 17:34
Désolé sabmafate, ta solution ne marche pas. Elle retourne un seul groupe contenant "aaaaaaab".
J'ai un peu avancé entre temps, sans trouver vraiment la solution. En utilisant les backreferences, j'obtiens le bon nombre de groupe mais chaque groupe est de contenu vide.

Voilà ce qeu j'ai écris :
            string exemplaire = "aaaaaaab";
            string pattern = @"(?<1>b)(?<1>\1)|(?<1>a\1)*";
            Regex reg = new Regex(pattern);
            MatchCollection Mcol = reg.Matches(exemplaire);
            int t = Mcol.Count;
            string[] Result = new string[t];
            for (int i = 0; i < t; i++)
                Result[i] = Mcol[i].Groups[1].Value;

Le nombre total de groupes t est bien égal à 8, mais chacun de ces groupes est vide (Result est une enumeration de longueur 8 dont chancuns de ses éléments est une chaine vide.)
En fait, j'ai trouvé ce pattern en me disant qu'il fallait mettre la valeurs b est mémoire et faire une sorte de récurrence en ajoutant à chaque fois un a. J'ai ensuite utilisé le caractère | qui est le seul à ma connaissance qui permet de revenir en arrière dans les expressions régulières. Tout ça pour dire que le fonctionnement détaillé de ce pattern m'échappe. Je ne comprends surtout pas pourquoi chaque groupe en sortie est vide. Quelqu'un saurait-il m'expliquer ce comportement étrange ? Suis-je loin du résultat que je recherche ?

Mathmax
0
Rejoignez-nous