Bonsoir,
Je souhaiterais savoir comment retirer tout les caracteres speciaux d'une chaine.
machaine = dv/dgh!75
manewchaine = machaine = dvdgh75
Merci
Bonsoir,
Je souhaiterais savoir comment retirer tout les caracteres speciaux d'une chaine.
machaine = dv/dgh!75
manewchaine = machaine = dvdgh75
Merci
tu peux parcourir chaque caractère, s'il est autorisé tu l'ajoutes à un stringbuilder sinon tu passes au suivant
le plus simple pour toi c'est d'effectuer une boucle sur chaque caractère de ta chaîne et pour chaque caractère :
- tu convertis ton caractère en décimal
- tu régarde si la valeur décimale est compris :
- 48 et 57 : ça correspond à un chiffre
- 65 et 90 : ça correspond à une lettre en majuscule
- 97 et 122 : ça correspond à une lettre en miniscule
- si ton caractère correspond à l'une des trois plages citées précédemment alors tu concactène ce caractère avec ta variable maNewChaine
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 var toto = "bla!01234"; var cleanToto = String.Concat(toto.ToArray().Where(c=>(c>='a'&& c<='z')||(c>='A'&& c<='Z')||(c>='0'&& c<='9')));
Les expressions régulières sont tes amies
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Dim chaine As String = "dv/dgh!75" Dim chaine2 As String = Regex.Replace(chaine, "[^a-zA-Z0-9]", "")
Justement, c'est plutôt performant sur des "petits trucs"... en tous cas dans un cas comme celui-ci où l'expression régulière est très simple, ça ne pose pas de problème. Par contre quand la regex devient un peu complexe, il faut faire gaffe au backtracking qui peut très vite dégrader les perfs.
D'une manière générale, si une regex va être utilisée souvent, on peut améliorer les perfs en utilisant une expression compilée :
A la création de la Regex, ça génère dynamiquement un assembly qui implémente la machine d'états correspondant à la regex. C'est donc plus long pour la créer, mais une fois que c'est fait l'exécution est plus rapide...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Dim expr As New Regex(pattern, RegexOptions.Compiled) ... Dim chaine2 = expr.Replace(chaine, "")
Bonjour,
j'ai fait un petit test, et je suis très surpris que la boucle de la seconde fonction soit aussi rapide que la Regex de la première ?
NB : de plus la Regex élimine les caractères accentués, (au cas où, on aimerait les conserver).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 Private Function ValidTextRegex(ByVal input As String) As String input = Regex.Replace(input, "[^a-zA-Z0-9]", "") Return input End Function Private Function ValidTextIsLetter(ByVal input As String) As String For Each Chr As Char In input If Not Char.IsLetterOrDigit(Chr) Then input = input.Replace(Chr, "") End If Next Return input End Function
combien de nanosecondes ?
je ne pense pas qu'un regex puisse être plus rapide à exécuter qu'un algorithme bien écrit pour le cas qu'on veut traiter, au mieux aussi rapide ... (bien sur on peut aussi écrire un algo plus lent)
dans le cas présent, le regex va surement faire la même chose que l'ago, parcourir tous les caractères ...
un regex est rapide à écrire certes, mais il faut bien connaitre comment ca se passe derrière pour ne pas avoir de contre performance
et je pense aussi que tout développeur doit être capable d'écrire des algos
j'ai pas testé mais es-tu sûr que ta fonction ci-dessous fonctionne correctement vu que tu parcours une chaîne de caractère input dans un foreach et tu la modifies dans la même portée dans le foreach.
Encore une fois j'ai pas testé mais, normalement tu devrais avoir une exception du genre : "La collection a été modifiée".
Bon pour en revenir à la rapidité d'exécution, je suis totalement d'accords avec tomlev et c'est ce qui est dit dans la plupart des docs que j'ai pus lire. je teste et je vous tiens au courant.
Quant à toi chrismonoye as-tu testé avec la version compilée de la regex ?
L'idée est bonne mais je ne suis pas certain que cette méthode puisse être utilisée dans tous les contextes;
Par exemple avec du .net s'exécutant en SQLCLR, c'est très restrictif - de facto on ne peut pas, entre autres, dans ce contexte, utiliser Linq pour des raisons collatérales de déclarations "internes" de static en lecture/écriture.
bien content d'être plussoyé sur ce sujet, c'est pas souvent le cas
je ne sais pas écrire un regex, mais une fois j'ai fait des tests avec un regex qu'on m'a écrit et une fonction que j'avais écrit, ayant besoin de performance du à un nombre d'appels assez élevé et le regex était 80x plus lent
m'enfin je ne savais pas à l'époque que ca pouvait se compiler ... les chiffres auraient surement été moins catastrophiques ...
néanmoins je conçois qu'une fois qu'on sait les utiliser ca doit se coder vite et ca peut répondre à toutes sortes de besoins, j'ai déjà vu des utilisations pour récupérer un tableau de valeur entre balises dans de l'html, et c'est clair que la dessus des indexof et autre substring c'est chiant à écrire, et plus long que les 3 lignes de regex/match équivalentes![]()
Bonjour,
Non, je ne rencontre pas d'erreur.
En relisant Francesco BALENA, sur l'objet String, il écrit que cet objet est immuable, que les méthodes qui tentent de le modifier ne modifient pas le String d'origine, mais en retourne un autre que l'on peut assigner à la même variable.
Ceci explique peut être cela ?
Quant à la rapidité d'exécution, la palme revient à Pol avec son StringBuilder :
(Regex compilée), et après plusieurs rappels.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Private Function ValidTextStringBuilder(ByVal input As String) As String Dim sb As New System.Text.StringBuilder For Each Chr As Char In input If Char.IsLetterOrDigit(Chr) Then sb.Append(Chr) End If Next Return sb.ToString End Function
Bien sûr les écarts sont infimes, mais c'était pour voir.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager