""Purifier" un string

Résolu
Flip84 Messages postés 17 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 21 avril 2006 - 16 déc. 2004 à 16:49
Flip84 Messages postés 17 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 21 avril 2006 - 19 déc. 2004 à 23:14
Bonjour, j'suis débutant en C# et je souhaiterais comme le dit le sujet "purifier" un string.

Je m'explique :
On a un string, par exemple public string test = " Bonjour, je m'appelle Michaël ";

Ce que je souhaiterais ce serait à partir de cette chaine de récupérer "bonjourjemappellemichael".
Donc il faudrait élimener:
- tous les espaces
- les majuscules
- la ponctuation
Et transformer les caractères "spéciaux" tels que le ë de Michaël en caractère sans les accents.

En fait je veux faire ça sur le contenu d'une TextBox, mais ça doit être pareil.
Donc j'ai un début: Test.Text.ToLower().Trim()

Comment faire pour le reste ?
help :p

10 réponses

TUHABITES Messages postés 41 Date d'inscription mardi 30 septembre 2003 Statut Membre Dernière intervention 21 avril 2011
16 déc. 2004 à 17:46
Salut,
je pense quand même que RMI a bien raison d'utiliser Replace().
Mais je vais te proposer une solution plus pédagogique:

string chaine="Bonjour, je m'appelle michaël";
chaine=chaine.ToLower();
string nchaine="";
for (int i=0;i<chaine.Length;i++)
{
byte k=(byte)chaine[i];
if (k>223 && k<231) nchaine+="a";
if (k>231 && k<236) nchaine+="e";
if (k>235 && k<240) nchaine+="i";
if (k>241 && k<247) nchaine+="o";
if (k>248 && k<253) nchaine+="u";
if (k==231) nchaine+="c";
if (k>96 && k<123) nchaine+=chaine[i];
}

La nouvelle chaine "épurée" est dans nchaine.
Il y a mieux notement avec Regex.Replace.
3
ricklekebekoi Messages postés 303 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 24 avril 2009 5
19 déc. 2004 à 21:20
for (int i=0;i<chaine.Length;i++)
{
byte k=(byte)chaine[i];
if (k>223 && k<231) nchaine+="a";
if (k>231 && k<236) nchaine+="e";
if (k>235 && k<240) nchaine+="i";
if (k>241 && k<247) nchaine+="o";
if (k>248 && k<253) nchaine+="u";
if (k==231) nchaine+="c";
if (k>96 && k<123) nchaine+=chaine[i];
}


Si l'on veut parler performance, il me semble que mettre des "else" devant tous les if sauf le premier sauverais 6 tests.

De plus, en faisant ainsi, et sachant que la pluspart du temps, c'est la derniere condition qui risque d'être vrai, il faudrait la même en premier, et ainsi on sauvera 6 test la plupart du temps.
3
cs_RMI Messages postés 305 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 2 août 2010 2
16 déc. 2004 à 17:17
Tu peux utiliser machaine.Replace(" ","") pour supprimer les espaces et
machaine.Replace("é","e") pour remplacer les é par les "e"
Théo
0
Flip84 Messages postés 17 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 21 avril 2006
16 déc. 2004 à 17:38
Je pense avoir déjà essayé, mais Replace() n'acceptait pas "" comme 2ème paramètre si je me souviens bien.

Ca marcherait pour les caractères spéciaux mais ne serait-ce pas fastidieux (+ perte de perforimance) que d'appliquer autant de fois le traitement Replace qu'il y a de caractères spéciaux ?

S'il n'y a pas d'autres moyen je le ferai, mais il reste encore à trouver une solution pour les espaces :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_RMI Messages postés 305 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 2 août 2010 2
16 déc. 2004 à 17:50
Pour supprimer les " " ma méthode fonctionne pour le reste,
tu peux aussi traiter caractere par caratere en testant
if (char.IsPonctuation(machaine,monindice) ...

Théo
0
Flip84 Messages postés 17 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 21 avril 2006
16 déc. 2004 à 18:50
Merci à tous les 2, ça me sera très util dans mon petit programme.
Je vais pas chercher plus loin et tester la solution de TUHABITES.
Si vous avec pas de nouvelles de moi ici, c'est que tout va bien ;)
Merci merciii :D
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
17 déc. 2004 à 12:05
reviens quand même pour valider ce qui t'as convenu, ça pourra servir à d'autres :-)

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 14
17 déc. 2004 à 12:05
mouais...
mais les boucles for qd meme c un peu lourd....

je trouve le replace plus élégant...

ps: si jamais tu choisi une des options retourne qd meme sur le site pour valider la "bonne" solution...

tcho bonnes fetes

Arthenius

"Ce qui ne me tue pas, me rend plus fort..."
0
Flip84 Messages postés 17 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 21 avril 2006
18 déc. 2004 à 14:12
*réfléchissage*

1. Le Replace() devrait s'exéctuer et donc passer en revue tous les caractères de la chaine X fois:
- 1 pour les espaces
- 6 pour les caractère spéciaux
- et encore Y fois pour tous les signes de ponctuations.
Ce qui donne 7+Y tests sur chaque caractère de la chaine.

2. La boucle permet de ne faire "que" 7 tests par caractère sur tous les caractères de la chaine.

La 2ème solution me parait meilleure et c'est elle que j'ai employée, maintenant je peux me tromper sur le fonctionnement de Replace()

Voila ;)

PS: c'est bien le code unicode des caractères qu'on test dans la boucle ou j'ai mal compris ? :p
0
Flip84 Messages postés 17 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 21 avril 2006
19 déc. 2004 à 23:14
C'est juste ;)
0
Rejoignez-nous