Expressions régulières : capture de groupes

Signaler
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008
-
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008
-
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

Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
14 février 2014
38
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#]
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

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