Utilisé une regex pour remplacer des occurrences [Résolu/Fermé]

Signaler
Messages postés
335
Date d'inscription
mardi 24 février 2015
Statut
Membre
Dernière intervention
15 décembre 2019
-
Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
-
Bonjour,

je suis exactement dans le même cas de figure que ce poste :
https://stackoverflow.com/questions/6143642/way-to-have-string-replace-only-hit-whole-words

je cherche a remplacer un mot entier par un autre sans modifier les autre qui sont similaire.
par exemple :
j'ai un tableau qui contient -> FR / Francais / Fr / Francois / Fromage / fR

je veut remplacer chaque occurrence du mot "FR" (sans prend en compte la case) par "FRANCE" mais ne pas modifier les autres mot qui comprenne pourtant les lettre "fr" .


voici donc mon bout de code que j'ai adapter avec la réponse donné sur Stackoverflow.

string[] replaces = File.ReadAllLines(Globals.REFPATH);   (mon fichier input)

            string content = File.ReadAllText(Globals.FILEMAJ);    (mon fichier output)

            foreach (string s in replaces)
            {
                string[] r = s.Split(';');
                if (r.Length > 1 && !string.IsNullOrWhiteSpace(r[0]) && !string.IsNullOrWhiteSpace(r[1]))
                {
                    string pattern = @"\b" + r[0] + "\b";

                    MessageBox.Show(pattern + "  ->  " + r[1]);

                    content = Regex.Replace(content, pattern, r[1]);

                }
            }


cela me semble correct et pourtant ca ne fonctionne pas ....
des idées ?


PS : si par miracle vous savez comment faire apparaître la console VS lors de l’exécution je suis preneur.
je suis actuellement obliger de debug avec des messageBox (c'est pas ultra ouf).

merci

Configuration: Windows / Chrome 71.0.3578.98

2 réponses

Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
554
La regex maintenant, il y a de nombreux sites qui permettent de tester les regex. L'avantage est de voir instantanément le résultat de son pattern.

Comme il y a quelques différences d'implémentations d'un langage à l'autre, je te conseille regexstorm.net qui applique l'implémentation .Net

http://regexstorm.net/tester?p=%5Cbfr%5Cb&i=+FR+%2F+Francais+%2F+Fr+%2F+Francois+%2F+Fromage+%2F+fR+&r=FRANCE&o=i

Clique sur l'onglet Context pour voir le résultat. Tu remarqueras que j'ai coché "IgnoreCase" et "Replace with"

Et voilà l'implémentation en C#
string res = Regex.Replace("FR / Francais / Fr / Francois / Fromage / fR ", @"\bfr\b", "France", RegexOptions.IgnoreCase);


Quand j'étais petit, la mer Morte n'était que malade.
George Burns
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63070 internautes nous ont dit merci ce mois-ci

Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
554
Le traitement ligne par ligne est cohérent.
Par contre dans l’absolue t’as pas besoin d’un second fichier pour ça
Messages postés
335
Date d'inscription
mardi 24 février 2015
Statut
Membre
Dernière intervention
15 décembre 2019
4
Si tu as une seconde manière de voir la chose, cela m'intéresse.

Ce second fichier est créé pour dans un premier temps servir de référence pour la correction mais également pour être réutilisable. Si un jours je décide de re corriger une seconde fois mon F1 je n'aurais pas besoin à nouveau de tous réécrire dans mon f2.

Mais je reste à ton écoute si tu as mieux à proposer. Dans tout les cas merci de ton suivie et de ta rapidité de réponse.
Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
554
Tu peux éventuellement charger la colonne de F1 dans un datagridview à 2 colonnes.
Remplir les corrections dans la seconde colonne, les appliquer et demander si l'utilisateur veut sauvegarder les corrections.
Ca limite les accès disques.
Messages postés
335
Date d'inscription
mardi 24 février 2015
Statut
Membre
Dernière intervention
15 décembre 2019
4
ça peut effectivement être une solution. faudrait que je test pour voir si ça rend le tout plus rapide.
Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
554
Je ne pense pas que tu verras la différence de temps.
Le truc c’est que tu n’auras pas à ouvirs excel ou notepad pour le csv et ton programme en même temps
Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
554
Bonsoir,

commençons par la fin
PS : si par miracle vous savez comment faire apparaître la console VS lors de l’exécution je suis preneur.
je suis actuellement obliger de debug avec des messageBox (c'est pas ultra ouf).


Entre la console, qui n'est franchement utile pour débuguer que si le code doit s'exécuter vite et sans interruption (traitement d'un flux par exemple), et le messagebox il y a quand même tout un tas d'outils de débug, des vrais proposés par VS.
https://openclassrooms.com/fr/courses/1526901-apprenez-a-developper-en-c/2867766-utilisez-le-debogueur

Pour débusquer un code comme celui que tu présentes, un point d'arrêt, des espions et éventuellement un peu de pas à pas est bien plus efficace.


Messages postés
335
Date d'inscription
mardi 24 février 2015
Statut
Membre
Dernière intervention
15 décembre 2019
4
c'est justement dans l'optique d'avancer pas a pas que je voudrais pouvoir de nouveau utilisé la console lors de l’exécution avec l'aide de : Console.WriteLine .
or suite a une mauvaise manipulation je n'est plus rien lors de l’exécution pour me venir en aide ....
Messages postés
14468
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juillet 2020
554
Non l’execution pas à pas ne se fait pas avec la console.
Lis le tuto que je t’ai mis en lien c’est bien expliqué.
Messages postés
335
Date d'inscription
mardi 24 février 2015
Statut
Membre
Dernière intervention
15 décembre 2019
4
je vais me plonger dedans ce soir alors, je vais en avoir grand besoin sous peu ...