Partage
  • Partager sur Facebook
  • Partager sur Twitter

[c#]Problème de capture dans regex

    28 mai 2011 à 12:43:15

    Bonjour,

    j'ai un problème de capture dans une regex:

    MatchCollection resultats= Regex.Matches(uneEquation, "ln([0-9]{1,})");
    


    le souci, c'est que pour la chaine d'entrée "ln5" par exemple, Matches ne vas pas me capturer le 5 comme on pourrait s'y attendre mais capture "ln5".

    des suggestions?? merci d'avance :)
    • Partager sur Facebook
    • Partager sur Twitter
      28 mai 2011 à 14:02:33

      Bonjour,

      Tout d'abord le plus "simple" :p ta regex peut s'écrire plus simplement en
      @"ln(\d+)"
      • @ pour avoir une chaine verbatim (uniquement dans le cadre du code C#, ça évite de devoir échapper le \ sinon tu peux aussi écrire "ln(\\d+)")
      • \d signifie un chiffre et est donc équivalent à [0-9]
      • + signifie au moins 1 fois et est donc équivalent à {1,}


      Ensuite, d'après la documentation le premier élément (groupe) d'un Match (qui hérite de Group) est la chaîne qui matche entièrement la regex donc dans ton cas ln5, pour obtenir ce que tu demandes tu peux faire comme ceci :
      string uneEquation = "ln5";
      MatchCollection resultats = Regex.Matches(uneEquation, @"ln(\d+)");
      
      foreach (Match m in resultats)
          Console.WriteLine(m.Groups[1]); // m.Groups[0] contient donc ce que tu voyait pour le moment ("ln5" dans ton cas)
          // ici si jamais Groups[1] n'existait pas (ou si tu te trompait d'indice en mettant 2 par exemple) tu aurais droit à une IndexOutOfRangeException
      

      Une autre possibilité est de passer par un groupe nommé, ça permet d'éviter d'avoir à se souvenir des indices de telle ou telle capture :
      string uneEquation = "ln5";
      MatchCollection resultats = Regex.Matches(uneEquation, @"ln(?<valeur>\d+)");
      
      foreach (Match m in resultats)
          Console.WriteLine(m.Groups["valeur"]);
          // ici si le groupe nommé "valeur" n'existe pas ça renvoie "juste" null
      


      J'espère que ça éclaircira un peu le truc, j'ai pas eu trop le temps de peaufiner ( :euh: quelle idée de faire plusieurs choses à la fois ^^)

      Cordialement !
      • Partager sur Facebook
      • Partager sur Twitter
      Censément, quelqu'un de sensé est censé s'exprimer sensément.

      [c#]Problème de capture dans regex

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown