Partage
  • Partager sur Facebook
  • Partager sur Twitter

Variable contenant un nom de variable

Comment faire une Regex pour les remplacer toutes

    26 septembre 2023 à 17:17:43

    Bonjour,

    en C#, est-il possible d'avoir une variable qui contient un nom de variable ?

    par exemple (c'est un exemple), j'ai ce code qui fonctionne bien

    string Eric = "complètement à la masse";
    string nom = "";
    nom = "Eric est {Eric}";
    Console.WriteLine(nom.Replace("{Eric}", $"{Eric}"));

    affiche à la console :

    Eric est complètement à la masse


    j'aurai aimé remplacer toutes les variables entre {} par leur valeur respective

    j'ai tenté

    Console.WriteLine(new Regex("{(.+?)}").Replace(nom, $"{$1}"));
    

    qui remplacerait toutes les chaines entre {} par leur valeur

    mais cela ne fonctionne pas, pour l'instant, je dois toutes les faire une par une

    Message = Message.Replace("{NoVersion}",NoVersion);
    Message = Message.Replace("{DateMaJ}",  DateMaJ);
    Message = Message.Replace("{DateSave}", DateSave);
    Message = Message.Replace("{Destination}", Destination);
    Message = Message.Replace("{Fichier}", Fichier);
    ...

    Message contenant un message avec plein de noms de variables entre {}

    Message = new Regex("{(.+?)}").Replace(Message, $"{$1}");

    Ne fonctionne pas

    quelqu'un aurait-il une idée ?

    Merci à toutes les bonnes âmes

    Pour être plus précis,

    j'ai une constante Langage qui contient "fr-FR"

    et j'ai une ligne (compliquée, je sais, mais c'est pour tester)

    string Message = new Regex(SearchErr.Replace("{NoErreur}", NoErreur.ToString())).Replace(XDocument.Load(Langage + ".xml").ToString(), "$1");

    à laquelle j'applique mon

    Message = new Regex("{(.+?)}").Replace(Message, $"{$1}");

    mais ça ne fonctionne pas, le compilo ne veut pas du : $"{$1}"

    -
    Edité par Eric-40 26 septembre 2023 à 17:25:14

    • Partager sur Facebook
    • Partager sur Twitter
      27 septembre 2023 à 11:35:01

      Pourquoi la "string-interpolation" de C#6 ne convient pas ?

      String interpolation in C# - C# | Microsoft Learn

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        29 septembre 2023 à 1:32:50

        Bonjour,

        Merci de vous soucier de mon problème

        Celui-là ?

        Console.WriteLine(new Regex("{(.+?)}").Replace(nom, $"{$1}"));


        Je pensais qu'il passerait, mais il est refusé à la génération (Visual studio 2019), c'est le $ à l'intérieur des accolades qui pose problème

        CS1525: Terme d'expression " non valide

        CS1073: Jeton inattendu du '$'  (Intéressante comme erreur)

        CS1056: Caractère inattendu '$'

        Je me suis torturé pendant longtemps et ai, provisoirement créé une array et une boucle.

        for (var i = 0; i < Rempl.GetLength(0); i++) Message = Message.Replace(Rempl[i, 0], Rempl[i, 1]);



        -
        Edité par Eric-40 29 septembre 2023 à 1:49:45

        • Partager sur Facebook
        • Partager sur Twitter
          29 septembre 2023 à 12:29:05

          plutôt comme ça

          string Eric = "complètement à la masse";
          string nom = $"Eric est {Eric}";
          Console.WriteLine(nom);
          


          le $ en début de chaine interpole les {xxx} de la chaine par la valeur de la variable xxx

          -
          Edité par umfred 29 septembre 2023 à 12:31:25

          • Partager sur Facebook
          • Partager sur Twitter
            29 septembre 2023 à 12:32:40

            Vous ne répondez pas à ma question.

            >j'aurai aimé remplacer toutes les variables entre {} par leur valeur respective

            C'est la fonction de la "string-interpolation".

            Vous l'utilisez dans l'évaluation du second paramètre de la méthode "Replace" de votre code.

            >

            Console.WriteLine(new Regex("{(.+?)}").Replace(nom, $"{$1}"));

            Et c'est pas du tout logique de la faire à cet endroit. Qu'est-ce que fout le premier "$" dans votre code ?

            En mettant ce "$" devant la chaine de caractère, vous demandez au compilateur d'ajouter le code qui remplacera les "{varName}" dans la chaine par la chaine de caractère retournée par la méthode "ToString" de l'objet pointé par la variable de nom "varName".

            Vous avez une variable qui porte le nom "$1" ? Moi, je pense que non.

            Je vous rappelle que le nom d'une variable doit commencer par un caractère alphabétique ou un underscore '_' (et dans des cas sombres avec un @) mais jamais par un "$". Donc le compilateur vous le dit "explicitement", ce putain de "$" n'a rien à foutre dans le nom d'une variable, et encore moins en premier caractère de son nom.

            Pourquoi un code comme

            Message = $"Eric est {Eric}";

            ne fait pas le job ?

            • Partager sur Facebook
            • Partager sur Twitter
            Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
              29 septembre 2023 à 13:31:20

              ok, je comprends bien

              le $1 est en fait la réponse (substitution) de la regex et non une variable

              le code ci-dessous fonctionne très bien, ce que je souhaite, c'est le généraliser à toutes les variables, comme si je faisais du mailing

              Message = $"Eric est {Eric}";

              En gros, j'ai une chaine de départ du style

              "Erreur n°{NoErreur}, la copie du fichier {Source} vers le fichier {Destination} a provoqué une erreur {Description} à {DateTime} sur le serveur {Serveur}."

              et je souhaiterais remplacer toutes les variables par leur contenu

              Le message est issu d'un fichier XML qui en contient beaucoup et est choisi en fonction de la langue (FR, EN, ...), je ne peux donc pas mettre un $ devant pour la string-interpolation, ou alors, je ne sais pas comment ça se fait.

              c'est pour cela que j'ai créé une regex (qui n'est peut-être pas la meilleure idée) en remplaçant tous les {.*} 

              J'espère que je suis clair (pas sûr)

              -------------------------------------------------------

              Bonjour et merci umfred

              comme je le disais ci-dessus, pour une chaine de caractères, je sais faire comme ci-dessous, mais mon problème est sur une chaine issue d'un fichier

              je la récupère dans une variable (nom pour l'exemple ci-dessous) mais ne peux pas faire en suivant de : nom = $nom; 

              nom contient déjà "Eric est {Eric}";

              peut-on, à partir de là faire de la string-interpolation de nom ?

              umfred a écrit:

              plutôt comme ça

              string Eric = "complètement à la masse";
              string nom = $"Eric est {Eric}";
              Console.WriteLine(nom);
              


              le $ en début de chaine interpole les {xxx} de la chaine par la valeur de la variable xxx

              -
              Edité par umfred il y a environ 1 heure

              -
              Edité par Eric-40 29 septembre 2023 à 13:40:19

              • Partager sur Facebook
              • Partager sur Twitter
                29 septembre 2023 à 16:45:49

                C# How to treat a string variable as interpolated string? - Stack Overflow

                Il est toujours possible de remplacer le mécanisme de dictionnaire de "Klaus Gütter" par des appels réflexif mais il faudrait mieux caractériser le terme de "variable". (principes de résolution de noms, etc...)

                • Partager sur Facebook
                • Partager sur Twitter
                Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                  29 septembre 2023 à 21:20:06

                  C'est à peu près ce que j'ai fait, une boucle for pour les remplacer une par une

                  J'espérais ruser mais ça ne marche pas à tout les coups

                  merci  et bonne soirée

                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 octobre 2023 à 4:51:37

                    Regardez bien les réponses, vous n'avez pas besoin d'une boucle.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                      31 octobre 2023 à 22:23:12

                      Désoler de passer par la, j'ai déjà eu du mal à comprendre ce que tu désirais. 
                      De ce que j'ai compris, moi je passerai par un dico ou une classe . 
                      avec un dico cela donnerait ceci 

                      Jai repris ta phrase que tu as mis plus haut
                      
                      string template = "Erreur n°{NoErreur}, la copie du fichier {Source} vers le fichier {Destination} a provoqué une erreur {Description} à {DateTime} sur le serveur {Serveur}";
                      
                      
                      Dictionary<string, string> variables = new Dictionary<string, string>
                      {
                          { "NoErreur", "123" },
                          { "Source", "fichier_source.txt" },
                          { "Destination", "fichier_destination.txt" },
                          { "Description", "Erreur inattendue" },
                          { "DateTime", DateTime.Now.ToString() },
                          { "Serveur", "ServeurXYZ" }
                      };
                      
                      foreach (var variable in variables)
                      {
                          template = template.Replace("{" + variable.Key + "}", variable.Value);
                      }
                      
                      Console.WriteLine(template);

                      Voila je ne sais pas si c'est ce que tu cherche mais cela peux t'inspirer

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Variable contenant un nom de variable

                      × 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