Regex pour grouper les chiffres 3 par 3 en partant de la fin

Résolu
-Eric40- Messages postés 5 Date d'inscription vendredi 29 septembre 2023 Statut Membre Dernière intervention 1 novembre 2023 - 29 sept. 2023 à 03:05
Whismeril Messages postés 19036 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 mai 2024 - 1 nov. 2023 à 08:51

Bonjour,

je cherche une RegEx qui permettrait de changer la couleur des chiffres tous les trois caractères, dans un nombre, et ce en partant de la fin.

Pour être plus clair, je veux insérer une couleur tous les 3 chiffres en partant de la fin

98123456789987654321

deviendrait

98(Beige)123(Orange)456(Beige)789(Orange)987(Beige)654(Orange)321

J'ai tenté "/(?:(\d{3})(\d{3}))/g" => (Beige)$1(Orange)$2

cela fonctionne mais l'analyse se fait du début et non de la fin (normal)

Si je fais des "(.*)(:(\d{3})(\d{3}))+$" =>  $1(Beige)$2(Orange)$3

il ne me colorise que les 6 derniers caractères (normal)

Le but est bien entendu de faciliter la lecture des grands nombres 

98123456789987654321    (Mais en couleur)

Je ne sais pas trouver la notion de répétition

Si une bonne âme a une idée ...

Merci

2 réponses

Rebonjour

si tu n'as pas encore trouvé de solution.

La regex pourrait être

(\d{0,2})(?:(\d{3})(\d{3}))+$

Cf un exemple ici https://regex101.com/r/9Imlia/1

Mais comme tu le vois la substitution basique ne fonctionne pas, parce qu'il y a plusieurs $2 et $3.

Ce qu'il faudrait faire, c'est boucler sur les matches et reconstituer ton nombre au fur et à mesure.

Un truc comme ça (codé vite fait à optimiser)

		string texte = "98123456789987654321";
		
		Regex maRegex = new Regex(@"(\d{0,2})(\d{3})+$");
		
		string resultat = "";
		
		Int32 i = 0;
		Match m = maRegex.Matches(texte)[0];

		foreach(Group g in m.Groups)
		{
			foreach(Capture c in g.Captures)
			{
				if(g.Value.Length > 3) 
					continue;
				
				Console.WriteLine(c.Value);
				if(i == 0)
				{
					resultat += "(rouge)" + c.Value;
					i = 1;
				}
				else
				{
					resultat += "(bleu)" + c.Value;
					i = 0;			
				}
			}
		}
		Console.WriteLine(resultat);
0
-Eric40- Messages postés 5 Date d'inscription vendredi 29 septembre 2023 Statut Membre Dernière intervention 1 novembre 2023
1 nov. 2023 à 08:42

Merci beaucoup pour cette réponse, en fait, j'ai trouvé, je fais un

Regex(@"(\d{0,3})(\d{0,3})", RegexOptions.RightToLeft).Replace(Entiere, @$"{CouleurAlternative}$1{CouleurBase}$2");

le RightToLeft aide bien ;)

bonne journée

0
Whismeril Messages postés 19036 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 mai 2024 656
1 nov. 2023 à 08:51

Ha oui, c'est une option que j'utilise peu, je n'y avais pas pensé.

Tant mieux si j'ai pu t'aider un peu.

Pense à marquer le sujet résolu si cela te convient 

0
Rejoignez-nous