none
Aide dans une expression Regex

Toutes les réponses

  • Bonjour,

    Merci pour cette occasion de réviser les expressions régulières. Clairement, il y avait besoin :)

    Je commence par quelque chose qui fonctionne mais sans que je comprenne trop bien pourquoi car j'y suis arrivé un peu à tâtons et en oubliant des trucs en route, ce qui me fait dire que logiquement ça ne devrait pas marcher :)
    Je mets le texte source dans textBox1, et je lance ça (le ? c'est dans la fenêtre immédiate) :

                Regex R = new Regex("[, ]{1,},{1,}");
                ? R.Replace(textBox1.Text, ", ", 1)

    Bon, maintenant, réfléchissons à faire ça proprement.

    En fait, j'essaierais bien quelque chose avec des groupes comme on fait sous Javascript, mais ... je suis resté en panne en route, là-dessus.

    Nous avions donc une alternance de séquences constituées d'espaces et de virgules, représentées par [, ], et de séquences contenant autre chose, représentées par ^[, ].

    Alternance signifie que dans chaque séquence on a au moins un caractère :

                Regex R = new Regex("[, ]{1,}^[, ]{1,}");

    C'est pour exploiter ça, après, que ... ça n'a pas vraiment marché. D'ailleurs il y aurait à revoir les nombres d'occurrences, peut-être bien que j'ai utilisé la syntaxe pour Javascript, et qu'en C# on met {1, n}. J'ai fait un essai en ce sens mais pas suffisamment insisté.

    Toujours est-il que je suis parti sur autre chose, qui pour être lourdingue pour des expressions régulières, a au moins le mérite de fonctionner :

                string pattern2 = @"([, ])";
                string input2 = "Paris, 75, ,, , ,,,France";
    
                string sortie = "";
    
                foreach (string s in Regex.Split(input2, pattern2))
                {
                    if(!string.IsNullOrWhiteSpace(s.Trim().Replace(",", "")))
                    {
                        sortie += s + ", ";
                    }
    
                }
                sortie = sortie.Substring(0, sortie.Length - 2);
                Console.WriteLine(sortie);

    A savoir que la fonction Split de Regex fractionne le premier argument chaque fois que le "pattern" indiqué par le deuxième argument est trouvé. Dans l'exemple ça peut retourner une virgule, un espace, ou autre chose. A chaque fois que ça retourne autre chose, je l'ajoute à la sortie avec une virgule derrière. A la fin il y a une virgule en trop à enlever.

    A part utiliser ça en l'état, il reste donc deux pistes de travail :

    • quelqu'un saura peut-être expliquer pourquoi ma première proposition fonctionne
    • sinon il reste à creuser la piste avec les groupes de remplacement (avec les parenthèses), qui une fois maîtrisée devrait permettre une solution largement plus élégante, ce qui était quand même le but d'utiliser des expressions régulières.



    • Modifié Gloops jeudi 15 février 2018 16:11
    jeudi 15 février 2018 16:05
  • Bonjour

    Et MERCI pour cette réponse très détaillée!

    Bernard


    Bernard Bouree

    lundi 19 février 2018 09:39