Partage
  • Partager sur Facebook
  • Partager sur Twitter

Regex : Format d'affichage de grands entiers

    29 septembre 2023 à 10:48:51

    Bonjour,

    je souhaiterais, pour plus de lisibilité et pour économiser la place en longueur, afficher les nombres en regroupant les chiffres 3 par 3 et en alternant les couleurs.

    par exemple : 89123456789123456789 deviendrait 89123456789123456789 

    et 23456789123456789  deviendrait 23456789123456789 

    J'ai tenté 

    /(\d{3})(\d{3})/g

    cela fonctionne mais les chiffres sont regroupés à partir du début, ce qui est normal

    puis

    /((?<!\d{6}))?(?:(\d{3})(\d{3}))+$/gm

    avec en substitution :

    $1{beige}$2{orange}$3

    mais là, il ne me prend que les 6 derniers chiffres, ce qui est normal aussi.

    Je n'arrive pas à partir de la fin et récupérer tout le découpage.


    Merci de l'aide qui me sera apportée

    Bonne journée

    Nota : Il peut il y avoir des non-chiffres avant le nombre, seul le nombre final importe

    Nota2 : Il faut que les 3 chiffres de droite aient toujours la même couleur. (orange dans mon exemple)

    Bon, j'ai une solution temporaire avec, en remplaçant les couleurs par # et / pour ne pas surcharger

    ^(_*)(?:(\d{0,3})(\d{3})|(\d{0,3}))(?:(\d{3})(\d{3}))?(?:(\d{3})(\d{3}))?$
    $1 #$2 /$3$4 #$5 /$6 #$7 /$8

    https://regex101.com/r/VwJinc/1

    Le problème, c'est qu'il faut faire une 2ème regex pour éliminer les #/ de la fin et que ce n'est que pour une taille limitée de nombre.

     Merci de l'aide qui me sera apportée

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

    • Partager sur Facebook
    • Partager sur Twitter
      29 septembre 2023 à 12:43:49

      Pourquoi ne pas mettre le token de fin de chaine dans l'expression régulière ? ($)

      Si la seconde capture est "greedy" et pas la première, cela ne réglerait pas directement votre problème ?

      P.S.: Je ne crois pas "/g" ou "/gm" est le moindre sens en RegEx .NET.

      • 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:02:32

        Bonjour bacelar, et merci

        (Ce sont les Flags modifiers) greedy + Multiline

        j'ai édité mon précédent post en même temps que votre réponse, j'ai une solution temporaire avec sa visibilité sur regex101

        c'est le fait d'avoir mis le $ pour partir de la fin qui fait que ça ne fonctionne pas

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

        Voici les liens pour les 2 regex que je fais en attendant mieux

        https://regex101.com/r/ZjBnj5/1

        https://regex101.com/r/jHWkCy/1

        La première pour insérer les couleurs, la 2ème pour nettoyer

        -
        Edité par Eric-40 29 septembre 2023 à 14:15:37

        • Partager sur Facebook
        • Partager sur Twitter
          29 septembre 2023 à 17:28:29

          Pourquoi des RegEx python et non .NET dans regex101.com ???

          J'ai les regex un peu rouillé.

          Mais pourquoi tout vouloir faire en une regex et sans rien d'autre ?

          Ma stratégie de feignant :

          -capturer tous les chiffres en fin de ligne via une regex de la forme "(\d*)$"

          -inverser le contenu de la capture

          -faire de l'appareillages par groupe de 3 chiffres sur le contenu inversé via une regex de la forme "(\d{0,3})"

          -Utiliser le tableau des captures en commençant par la fin pour construire la chaine résultat (comme vous savez si vous avez capturé un nombre pair ou impaire de résultat dans le groupe, vous savez si vous devez commencer par du beige ou de l'orange).

          • 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:14:14

            Merci bacelar

            j'y suis arrivé mais je n'ai pas de récursion, je me suis limité (pour l'instant) à 30 chiffres avant et après la virgule

            mais je ne lâche pas, je suis quasi sûr qu'il est possible de créer une Regex qui le fera

            Sinon, effectivement je pourrai faire une analyse de la chaine par programme.

            • Partager sur Facebook
            • Partager sur Twitter
              1 octobre 2023 à 0:01:42

              Bonjour,

              Je savais bien que j'y arriverais :

              "Nombre" est du type "decimal"

              "Avant", c'est le nombre de chiffres demandés pour l'affichage avant la virgule (espaces en tête si nécessaire)

              "Fixe", c'est la partie fixe du nombre, rangée dans un string

              "Orange" et "Beige" sont les codes des couleurs pour passer en orange ou en beige

              // Partie entière
              string Fixe = Math.Truncate(Nombre).ToString();
              int Len = Fixe.Length;
              
              if (Len > Avant && !Depassement) Fixe = Fixe.Substring(Len - Avant, Avant);
              
              Fixe = new string(' ', Math.Max(Avant - Len, 0)) + new Regex(@"(\d{0,3})(\d{0,3})", RegexOptions.RightToLeft).Replace(Fixe, @$"{Beige}$1{Orange}$2");
              



              Je vais la réécrire sous forme de classe pour plus de clarté et la commenter

              Merci à bacelar de m'avoir aidé

              • Partager sur Facebook
              • Partager sur Twitter

              Regex : Format d'affichage de grands entiers

              × 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