Utilisé une regex pour remplacer des occurrences

Résolu/Fermé
astrocurieux Messages postés 334 Date d'inscription mardi 24 février 2015 Statut Membre Dernière intervention 29 novembre 2019 - 17 janv. 2019 à 14:50
Whismeril Messages postés 18279 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mars 2023 - 23 janv. 2019 à 12:44
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

Whismeril Messages postés 18279 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mars 2023 888
Modifié le 17 janv. 2019 à 21:20
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
Whismeril Messages postés 18279 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mars 2023 888
17 janv. 2019 à 21:23
J'oubliais, on dirait que tu traites ton fichier ligne par ligne.
Une regex est capable d'avaler un fichier entier, plus rapidement (en général) que ligne par ligne.
0
astrocurieux Messages postés 334 Date d'inscription mardi 24 février 2015 Statut Membre Dernière intervention 29 novembre 2019 11
18 janv. 2019 à 08:48
bonjour Whismeril.
content de te retrouver et merci de ton assiduité .

ma regex semble bonne pour ce que je veut en faire mais le soucis c'est son pattern qui doit changer régulièrement . quand j'utilise le format suivant : @"\bfr\b"
cela marche aussi bien que dans ton exemple mais c'est pas le cas quand je fournie mon tableau qui contient tous les mots a rechercher : @"\b" + r[0] + "\b"

a ce moment la, il semble ne plus bien comprendre les balise \b et recherche tous mes mots avec un b en première lettre (et du coup il trouve rien)
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 008
18 janv. 2019 à 09:10
Bonjour,

Le problème à mon avis dans ton code, c'est que tu échappes la première chaîne @"\b" avec le @, mais pas la deuxième, qui ne contiendra donc pas @"\b" mais le caractère de contrôle Backspace.

Bref, remplace
@"\b" + r[0] + "\b" 
par
@"\b" + r[0] + @"\b" 


Xavier
0
astrocurieux Messages postés 334 Date d'inscription mardi 24 février 2015 Statut Membre Dernière intervention 29 novembre 2019 11
18 janv. 2019 à 09:14
merci Xavier,

ça semble effectivement être l'une des solutions !
je venais de corriger ce problème par moi même au moment ou tu as poster ta réponse.
voici ma version :
content = Regex.Replace(content, String.Format(@"\b{0}\b", r[0]), r[1], RegexOptions.IgnoreCase);

mon sujet passe donc en résolût une fois de plus grâce a votre aide !!
merci beaucoup
0
Whismeril Messages postés 18279 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mars 2023 888
18 janv. 2019 à 12:45
ma regex semble bonne pour ce que je veut en faire mais le soucis c'est son pattern qui doit changer régulièrement

Puisque le mot à remplacé est dans le même texte, on peut certainement écrire une regex unique qui fait tout.
Peux tu poster une ligne complète ?
0
Whismeril Messages postés 18279 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mars 2023 888
17 janv. 2019 à 19:38
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.


0
astrocurieux Messages postés 334 Date d'inscription mardi 24 février 2015 Statut Membre Dernière intervention 29 novembre 2019 11
18 janv. 2019 à 08:54
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 ....
0
Whismeril Messages postés 18279 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mars 2023 888
18 janv. 2019 à 12:39
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é.
0
astrocurieux Messages postés 334 Date d'inscription mardi 24 février 2015 Statut Membre Dernière intervention 29 novembre 2019 11
18 janv. 2019 à 19:26
je vais me plonger dedans ce soir alors, je vais en avoir grand besoin sous peu ...
0