IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Supprimer les caractéres spéciaux d'une chaine


Sujet :

VB.NET

  1. #1
    Membre confirmé Avatar de hugoclo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    615
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 615
    Points : 480
    Points
    480
    Par défaut Supprimer les caractéres spéciaux d'une chaine
    Bonsoir,
    Je souhaiterais savoir comment retirer tout les caracteres speciaux d'une chaine.
    machaine = dv/dgh!75
    manewchaine = machaine = dvdgh75
    Merci
    Lorsque le sage montre la lune du doigt l'idiot regarde le doigt.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    tu peux parcourir chaque caractère, s'il est autorisé tu l'ajoutes à un stringbuilder sinon tu passes au suivant
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Invité
    Invité(e)
    Par défaut
    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

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    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')));

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    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]", "")

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par PitMaverick78 Voir le message
    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')));
    Paraît que tu t'entraînes sur Linq et du coup tu te mets à tout essayer de mettre en Linq. continues comme-ça et tu serasl le roi du Linq sur dvp.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par tomlev Voir le message
    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]", "")
    Les expressions régulières c'est cool sauf que c'est pas performant pour un petit truc. Corrige moi si je dis des bétises.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    Les expressions régulières c'est cool sauf que c'est pas performant pour un petit truc. Corrige moi si je dis des bétises.
    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 :

    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, "")
    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...

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    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 ?
    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
    NB : de plus la Regex élimine les caractères accentués, (au cas où, on aimerait les conserver).

  10. #10
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    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
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par chrismonoye Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        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
    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 ?

  12. #12
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    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 ...
    Je plussoye

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  13. #13
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par tomlev Voir le message
    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...
    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.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  14. #14
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Je plussoye
    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
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par chrismonoye Voir le message
    NB : de plus la Regex élimine les caractères accentués, (au cas où, on aimerait les conserver).
    Tu peux utiliser "\W" à la place de "[^a-zA-Z0-9]", par contre ça conservera aussi le caractère "_"... Si tu veux aussi supprimer ce caractère tu peux faire ça : "\W|_"

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonjour,
    Citation Envoyé par h2s84 Voir le message
    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".

    Quant à toi chrismonoye as-tu testé avec la version compilée de la regex ?
    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 :
    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
    (Regex compilée), et après plusieurs rappels.
    Bien sûr les écarts sont infimes, mais c'était pour voir.

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/08/2010, 13h29
  2. Supprimer les retours chariots d'une chaine de caractère
    Par Seb33300 dans le forum Général VBA
    Réponses: 3
    Dernier message: 31/01/2009, 22h50
  3. Réponses: 13
    Dernier message: 09/01/2008, 01h32
  4. Réponses: 1
    Dernier message: 06/08/2007, 03h23
  5. [Jsp] Supprimer les caractère spéciaux d'une chaine
    Par PeteMitchell dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 13/05/2004, 11h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo