Arcy Posté(e) le 27 octobre 2016 Partager Posté(e) le 27 octobre 2016 '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 More sharing options...
RinDman Posté(e) le 27 octobre 2016 Partager Posté(e) le 27 octobre 2016 Utilises IndexOf pour retrouver la position et tu modifies directement comme un tableau. Si c'est la première occurrence que tu cherches, sinon y a le méthode String.Replace. Source : http://stackoverflow.com/questions/8809354/replace-first-occurrence-of-pattern-in-a-string Lien vers le commentaire Partager sur d’autres sites More sharing options...
quelqu'un Posté(e) le 28 octobre 2016 Partager Posté(e) le 28 octobre 2016 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 More sharing options...
Fuinril Posté(e) le 28 octobre 2016 Partager Posté(e) le 28 octobre 2016 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 More sharing options...
quelqu'un Posté(e) le 29 octobre 2016 Partager Posté(e) le 29 octobre 2016 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 More sharing options...
Arcy Posté(e) le 31 octobre 2016 Auteur Partager Posté(e) le 31 octobre 2016 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 ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Fuinril Posté(e) le 3 novembre 2016 Partager Posté(e) le 3 novembre 2016 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 More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.