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 :

Comparer deux mots avec exactitude


Sujet :

VB.NET

  1. #1
    Membre habitué Avatar de CLeBeR
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Points : 188
    Points
    188
    Par défaut Comparer deux mots avec exactitude
    Bonjour,
    je voudrais détecter si des mots sont présents dans mon texte, le code fonctionne bien mais je suis face à un "dilemme". Lorsqu'un mot par exemple : "continent" est présent dans mon texte, mon programme va détecter qu'il y a le mot "con" (qui est présent dans ma liste). J'ai trouvé alors la "parade" de ne faire détecter que si il y a un espace avant et après le mot. Ainsi, "continent" ne sera plus détecté mais uniquement si le texte contient " con " (avec un espace avant et après). Le problème c'est que si le texte contient : "con.", le mot de ne sera pas détecté. Je voudrais donc savoir si vous connaitriez pas un moyen afin de détecter si il y a quelque chose avant et après et si c'est une lettre, on annule la détection.
    Voici le code (simplifié):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Sub VerifierMotInterdit()
            For Each s As String In ListeDeMots
                If TextBox.Text.ToLower.Contains("" & s.ToLower & "") Then 'C'est ici qu'on peut choisir les espaces ou non.
                    MsgBox(TextBox.Text & vbNewLine & "Mot interdit détecté : " & s.ToLower)
                    TextBox.Clear()
                End If
            Next
            TextBox.Clear()
        End Sub
    Merci pour votre aide !
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

  2. #2
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Salut Cleber,

    Il faut que tu creuses du côté de RegEx et son délégué matchEvaluator. Je l'utilises dans un de mes projets, si à l'occasion tu veux jeter un œil alors c'est complètement open ici :

    https://bitbucket.org/3dotdev/vbnet-string-renamer


    A+

  3. #3
    Membre habitué Avatar de CLeBeR
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    Salut wallace1,
    j'ai du mal avec le RegEx, j'ai regardé ces articles :
    http://msdn.microsoft.com/fr-fr/libr...vs.110%29.aspx
    http://www.dotnetperls.com/regex-match-vbnet
    http://www.dotnetperls.com/word-count-vbnet
    ainsi que ton projet. Si j'ai bien compris, le RegEx à l'aide d'une table qui définit une fonction, par exemple \d+ ne va retenir que les décimales d'une chaine ? Mais moi il faudrait en fait que soit :
    - A chaque mot correspondant dans ma textbox, je regarde si il y a un caractère avant et après et si il n'y a rien ou bien un caractère spécial autre qu'un chiffre et une lettre, la détection est bonne. Par exemple : "con." est précédé de rien et suivi d'un point donc la détection se fait.
    - La deuxième solution serait d'utiliser le RegEx pour détecter les mots que j'ai vu dans cet exemple et de tester chaque mot ? Mais est-ce si la textbox contient uniquement un mot sans rien qui le précède, la détection aura bien lieu ?
    Merci.
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

  4. #4
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    C'est bien le regex qui conviendrait le mieux et il faut que tu créés le pattern qui convient à tes règles restrictives ou permissives.
    Lorsqu'un résultat est trouvé avec la méthode matches tu peux jouer avec les index pour savoir si le prochain ou précédent caractère est celui que tu ne veux pas !

    Ou alors il faudra que tu décides d'opter pour un controle richtextbox en lieu et place de ton textbox ainsi tu pourras plus aisément parcourir l'ensemble du texte avec des indicateurs de positions ou index.



    A+

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Autre solution:
    remplacer par
    remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (" "+TextBox.Text+" ").Replace('.',' ').Replace(';',' ').ToLower()
    Ajouter autant de Replace que de séparateurs soit , . ; ! ? : / \ § + * ) ( ] [ } {
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  6. #6
    Membre habitué Avatar de CLeBeR
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    Salut,
    le problème c'est que ma textbox contient plusieurs mots... De plus, il faut qu'il détecte un mot si il n'est pas précédé ni suivi d'un caractère.
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

  7. #7
    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,
    en poursuivant sur l'idée de wallace1 :
    avec les ancres \b (limites de mot) et une collection de correspondances ça devrait jouer.
    Vous pouvez tester ce simple modèle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            Dim pattern As String = "\b\w+\b"
            Dim rx As New Regex(pattern, RegexOptions.Compiled)
     
            Dim matches As MatchCollection = rx.Matches(txt)
    Peut être suffira t'il?
    NB : pour celui qui s'intéresse aux expressions "régulières", le premier lien est puissant.

  8. #8
    Membre habitué Avatar de CLeBeR
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    Merci à tous pour votre aide et merci à chrismonoye, le code marche super. J'ai essayé de le commenter au mieux pour ceux qui ne connaitraient pas le Regex comme moi, c'est une notion très utile et très puissante mais assez complexe par sa syntaxe je trouve, merci encore !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            Dim pattern As String = "\bw+\b" 'Remplacer w+ par un mot les \b représentent la position avant et après le mot (voir cours)
            Dim rx As New System.Text.RegularExpressions.Regex(pattern, RegexOptions.Compiled) 'Creation du Regex avec sa condition (son pattern)
            MsgBox(rx.IsMatch(TextBox1.Text)) 'affiche True si le mot et sa condition sont détectés, si non affiche False
    Cours : http://stormimon.developpez.com/dotn...lieres/#L3.4.2
    http://msdn.microsoft.com/fr-fr/libr...vs.110%29.aspx
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

  9. #9
    Membre habitué Avatar de CLeBeR
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    Je rouvre le sujet car en ayant fait des tests approfondis, je me suis rendu compte qu'il y a un petit problème, il semblerait que le regex soit un petit peu trop intelligent ...
    Je m'explique, lorsque je tape le mot "con" ou "c o n" et quelque soit sa forme, même avec "c4545o$*$*n", le programme le détecte, jusque là tout va bien, bien que je trouve cela hallucinant !
    Le problème c'est que mon programme avec un long texte détectait à chaque fois le mot : "f|_|ck" qui est dans ma liste... Je me suis donc demandé pourquoi et là j'ai essayé d'entrer uniquement : "_" et le mot est toujours détecté, alors je pense que les "filtres" ou le patern (je vois ça comme un filtre) est trop large, qu'en pensez vous ?
    Voici le code si ça peut aider : (ListeDeMots est une List(Of String))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    For Each s As String In ListeDeMots
     
                Dim pattern As String = "\b" & s & "\b" 'Remplacer w+ par un mot les \b représentent la position avant et après le mot (voir cours)
                Dim rx As New System.Text.RegularExpressions.Regex(pattern, RegexOptions.Compiled) 'Creation du Regex avec sa condition (son pattern)
     
                If rx.IsMatch(TextBox.Text) Then 'affiche True si le mot et sa condition sont détectés, si non affiche False
                    MsgBox("true" & s)
                Else
                End If
            Next
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

  10. #10
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    RE cleber,

    Donc comme le disait chrismonoye, les réponses que tu tu recherches depuis le début se trouve dans le lien que je t'ai donné :

    https://bitbucket.org/3dotdev/vbnet-string-renamer

    plus exactement ici : https://bitbucket.org/3dotdev/vbnet-...n.vb?at=master

    http://imabox.fr/a2/142602651joYnnq29.png


    A+

  11. #11
    Membre habitué Avatar de CLeBeR
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    Salut wallace1,
    vraiment je sèche là ... J'ai essayé la même syntaxe que tu as faire pour ton projet mais le problème demeure toujours ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            For Each s As String In ListeDeMots
     
                          Dim rx As MatchCollection = New System.Text.RegularExpressions.Regex(("\b(" & s & ")\b"), RegexOptions.IgnoreCase).Matches(TextBoxKeylogger.Text)
                           For Each amatche As Match In rx
                    MsgBox(s.ToString)
                        Next
    Je pense à quelque chose, il faudrait que j'ajoute dans mon paterne que la première lettre doit être la première lettre ou caractère de s et la dernière lettre ou caractère du pattern doit être la dernière lettre ou caractère de s ? Dans ce cas là il n'y aurait plus le problème pour le mot "f|_|ck" qui est détecté quand je tape "_" ?
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

  12. #12
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Cleber tu ne comprends absolument pas comment fonctionne le pattern et surtout à quoi corresponds le caractère "|" !!

    Dans ton pattern tu dois placer tout tes mots séparés du caractère "|", ce séparateur corresponds à un "Or" d'une chaîne de caractères contigu !
    Ce qui veut dire que tu ne dois pas boucler ton list(Of String) pour peupler la variable du pattern "s" !
    Tu dois parcourir ton list(Of String) en vue de placer tes éléments les uns à la suite des autres en ajoutant le séparateur "|".

    Prenons l'exemple suivant :

    0- Voici le contenu de mon TextBoxKeylogger.text :
    Elle est contente mais a tout de même contesté les mots qu'on peut retrouver dans ce conte !
    En fait, on trouve souvent des saletés sous les livres bien que cette étagère ne soit pas sale mais un peu poussiéreuse !
    Il faut saler la salers qu'on prépare chez le boucher.
    1- Ton list (Of String) contient les éléments suivants : conte, contesté, sale, saletés
    2- Tu déclares une variable de type String nommée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim ReservedString as string = String.empty
    3- Tu boucles ta liste afin que ta variable ReservedString prenne cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReservedString  = "conte|contesté|sale|saletés"
    4- Enfin tu parcours comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                    Dim rx As MatchCollection = New System.Text.RegularExpressions.Regex(("\b(" & ReservedString & ")\b"), RegexOptions.IgnoreCase).Matches(TextBoxKeylogger.Text)
                    For Each amatche As Match In rx
                        MsgBox(amatche.ToString)
                    Next
    J'espère que c'est plus clair ??

    PS : je n'ai pas testé donc à toi de l'adapter à tes besoins.......


    A+

  13. #13
    Membre habitué Avatar de CLeBeR
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    Salut wallace,
    j'ai compris maintenant comment mieux utiliser le pattern (même si je trouve que ça reviens au même de mettre à chaque fois \bMonMot\b ...)
    Bref, j'ai fais comme tu m'as dit et comme le problème persistait, j'ai encore cherché ... Et tout à coup, j'ai compris !
    Le problème c'est que comme tu me l'a dit, le "|" veut dire "Ou" et là tout s'éclaire ! Mon mot étant écrit "F|_|ck", lorsque j'écris un simple "_" la détection se passe puisque c'est ce qu'on lui a demandé sans le vouloir ...
    Donc ce que j'ai fais, c'est que dans ma ListOf j'ai enlevé tous les mots ou le "U" était écrit "|_|" et ça fonctionne (même avec mon premier code).
    Voilà donc du coup ça veut dire qu'on ne doit pas mettre de mot avec un "|" à moins qu'il y ait une solution pour corriger ce problème...
    Je ferai des tests approfondis demain pour être sur que tout va bien auquel cas je mettrai en résolu le sujet !
    Merci @+
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

  14. #14
    Membre habitué Avatar de CLeBeR
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    Après plusieurs tests, je n'ai plus eu le problème, il s'agissait donc d'un mot écrit avec des "|" (Alt GR + 6) qui jouait le rôle du "Or".
    Merci de votre aide !
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

  15. #15
    Membre émérite Avatar de meziantou
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Points : 2 439
    Points
    2 439
    Par défaut
    Tu peux utiliser Regex.Escape pour gérer les "|" et tous les autres (\, *, +, ?, |, {, [, (,), ^, $,., # et espace)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comparer deux char avec equals
    Par MiXinG dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 01/04/2008, 20h14
  2. Problème pour comparer deux mots
    Par Fredo123456 dans le forum C
    Réponses: 4
    Dernier message: 18/02/2008, 22h25
  3. Souci pour comparer deux objets avec equals()
    Par xillibit dans le forum Langage
    Réponses: 7
    Dernier message: 30/09/2007, 15h41
  4. comparer deux fichiers avec une api windows
    Par sweetdreamer dans le forum Windows
    Réponses: 4
    Dernier message: 25/05/2006, 22h10
  5. [struts] Comparer deux variables avec <logic:equal>
    Par trax020 dans le forum Struts 1
    Réponses: 4
    Dernier message: 29/05/2005, 11h08

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