Aller au contenu

Rechercher et remplacer une chaine de caractères


Arcy

Messages recommandés

'jour !

J'ai un p'tit programme en C# qui vérifie une chaine de caractère et remplace certaines expressions par d'autres.

J'ai donc pensé au REGEX pour obtenir ce qui m'intéresse entre deux caractères (£METEO£, £TEMPERATURE£, ...) et pouvoir le remplacer plus loin (SOLEIL, FROID).

Donc si, dans un champ texte, l'utilisateur tape l'un des mots clés, il obtient la réponse aussitôt.

Le problème est dans le regex qui m'extrait pas l'information que je le souhaite. Il recherche le premier caractère £ puis le dernier et m'extrait la chaine, puis ainsi de suite vers l'intérieur de la chaine.

string a = "bla bla bla bla £METEO£ bla bla bla bla £TEMPERATURE£ bla bla";

Match match = Regex.Match(a, "£(.+)£");
if (match.Success)
{
  string tab = match.Groups[0].Value;
}
// Résultats de match.Groups
//[0] = £METEO£ bla bla bla bla £TEMPERATURE£
//[1] = METEO£ bla bla bla bla £TEMPERATURE

Or, je cherche ceci :

// Résultats de match.Groups
//[0] = £METEO£
//[1] = £TEMPERATURE£

Pour obtenir ces infos, j'ai également pensé au a.Split('£') mais il découpe toute la chaine (en retirant le caractère qui m'intéresse, ce qui fait que j'ignore si je dois remplacer ou non).

Si vous avez des idées ...

Merci à vous ;)

Lien vers le commentaire
Partager sur d’autres sites

Ton premier problème est que ta regex est "greedy", donc elle va te retourner la plus grande string possible dans ton texte d'entrée. En l'occurence, tout ce qui est entre le premier £ du premier mot a remplacer, et le dernier £ du dernier mot à remplacer. D'ou ce qu'il y a dans Groups[1] (Groups[0] est toujours la string complete à priori).

Donc il faut soit que tu trouves comment demander à Match() de ne pas être greedy, soit que tu modifies ta regex pour le faire d'elle même(en recherchant tout sauf £ plutôt que tout dans les parentheses de la regexp)

Ensuite ton Match() ne te retournera qu'une section qui matche a la fois, donc il faudra que tu passes en boucle sur ta chaine tant que Match() trouve des choses

Lien vers le commentaire
Partager sur d’autres sites

Je te présente ton nouveau meilleur ami : http://www.ultrapico.com/expresso.htm

Have fun ;)

Il y a 8 heures, quelqu'un a dit :

Ensuite ton Match() ne te retournera qu'une section qui matche a la fois, donc il faudra que tu passes en boucle sur ta chaine tant que Match() trouve des choses

Tu peux faire ça. Ou tu peux coder proprement et utiliser Matches

Lien vers le commentaire
Partager sur d’autres sites

Il y a 14 heures, Fuinril a dit :

Ou tu peux coder proprement

Cette partie n'était pas nécessaire. Je n'ai jamais fait de C#, et pourtant j'ai mieux répondu que la réponse précédente a quel était le problème qu'il avait. Ensuite, j'ai vu un futur problème potentiel dans la manière dont il avait écrit son code, et j'ai suggéré une alternative avec la seule chose qui je connaisse de C#, ce que j'ai en face des yeux. Qu'il y ait des méthodes plus adaptées tant mieux et merci de les mentionner, mais tu peux faire attention à ton ton

Lien vers le commentaire
Partager sur d’autres sites

Le 28/10/2016 à 19:43, Fuinril a dit :

Je te présente ton nouveau meilleur ami : http://www.ultrapico.com/expresso.htm

\o/

J'ai pas utilisé Expresso (payant après 60 jours, je me suis tourné vers son équivalent gratuit RegexLab .NET et avec l'aide de cette page, j'ai pu faire le code qui m'intéressait :

Regex pattern = new Regex(@"£[A-Z]{0,}£", RegexOptions.Singleline); // donné par RegexLab
MatchCollection tab = null;

string a = "bla bla bla bla £METEO£ bla bla bla bla £TEMPERATURE£ bla bla";

if (pattern.IsMatch(a))
    tab = pattern.Matches(a);

/*
tab[0] = £METEO£
tab[1] = £TEMPERATURE£
*/

Merci pour vos coups de main !

:inpactitude:

Lien vers le commentaire
Partager sur d’autres sites

Le 31/10/2016 à 15:40, Arcy a dit :

\o/

J'ai pas utilisé Expresso (payant après 60 jours, je me suis tourné vers son équivalent gratuit RegexLab .NET et avec l'aide de cette page,

 

Il me semble que pour faire sauter la limitation il suffit de se créer un compte (gratuit). Après ça fait des années que j'ai ma version donc ça a peut être changé, l'important étant que tu aies trouvé une solution ;)

 

Le 29/10/2016 à 09:50, quelqu'un a dit :

Cette partie n'était pas nécessaire. Je n'ai jamais fait de C#, et pourtant j'ai mieux répondu que la réponse précédente a quel était le problème qu'il avait. Ensuite, j'ai vu un futur problème potentiel dans la manière dont il avait écrit son code, et j'ai suggéré une alternative avec la seule chose qui je connaisse de C#, ce que j'ai en face des yeux. Qu'il y ait des méthodes plus adaptées tant mieux et merci de les mentionner, mais tu peux faire attention à ton ton

Je n'ai rien dit quant à la qualité de la réponse, juste cette partie.

Tu t'adresses potentiellement à des débutants et leur dire ça c'est leur dire de réinventer la roue (ce qui est une très mauvaise pratique). Donc oui pour souligner le soucis avec un match(), par contre si tu ne connais pas le C# tu peux juste conseiller d'aller checker si il n'existe pas de méthode plus adaptée dans la doc et au pire de faire une boucle.

C'est paradoxal d'ailleurs, car si la partie précédente de ta réponse n'était pas de cette qualité le problème ne se poserait pas. En l'état le débutant va lire le début, se dire qu'il a à faire à un expert et juste appliquer les conseils donnés sans chercher plus loin.

 

Bref c'était pas dit méchamment, désolé si tu l'as mal pris

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...