Comparer deux mots avec exactitude [Résolu]

CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 27 février 2018 Dernière intervention - 24 févr. 2014 à 21:11 - Dernière réponse : CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 27 février 2018 Dernière intervention
- 25 févr. 2014 à 19:01
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é):
    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

Selon wallace1 de Developpez : http://www.developpez.net/forums/d1418604/dotnet/langages/vb-net/comparer-mots-exactitude/#post7706950 , il faudrait utiliser le RegEx, j'ai consulté le cours sur Developpez et effectivement il y a je pense tous les outils pour résoudre mon problème, le problème c'est que je n'arrive pas à trouver la logique à effectuer pour résoudre mon problème, la marche à suivre.
Si vous pouvez m'aiguiller ...
Merci !
Afficher la suite 

Votre réponse

13 réponses

Whismeril 12033 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 25 septembre 2018 Dernière intervention - 24 févr. 2014 à 21:24
0
Merci
Bonsoir, les Regex sont des outils tout à fait indiqués.

Ici un code qui permet de les tester. Par contre c'est en C#, il existe des traducteurs si tu as besoin.
Commenter la réponse de Whismeril
NHenry 14262 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 22 septembre 2018 Dernière intervention - 24 févr. 2014 à 21:28
0
Merci
J'aurais utilisé une méthode plus artisanale :
Faire un split sur le texte avec les différents séparateurs de chaines ",.;: ' ..." puis, comparer les mots obtenus dans un tableau.
Commenter la réponse de NHenry
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 24 févr. 2014 à 22:15
0
Merci
Bonjour
Ton explication n'est pas claire

Le problème c'est que si le texte contient : "con.", le mot de ne sera pas détecté.

justement tu ne veux pas le detecter ex continent
Commenter la réponse de cs_ShayW
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 24/02/2014 à 22:29
0
Merci
Bonjour
L'utilistion de l'opérateur Like suffit.
Soit toto le texte à traiter :
toto Like "*[., ,;,:,!,?,,,,]con[., ,;,:,!,?,,,,]*" Or toto Like "con[., ,;,:,!,?,,,,]*"
repèrera (retournera True) le mot con qu'il apparaisse au début, à la fin ou qu'il soit suivi ou précédé d'un espace ou d'un signe de ponctuation.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Whismeril 12033 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 25 septembre 2018 Dernière intervention - 24 févr. 2014 à 22:38
Oh oui, on en a parlé il y a quelques jours et je l'avais déjà passé à la trappe.
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 24 févr. 2014 à 22:57
Bonsoir; Whismeril,
C'est peut-être que tu ne "likes" pas like ...
Pardonne la brièveté du message (main abimée).
Whismeril 12033 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 25 septembre 2018 Dernière intervention - 24 févr. 2014 à 23:01
Oui d'ailleurs t'es pas en arrêt maladie?
Commenter la réponse de ucfoutu
CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 27 février 2018 Dernière intervention - 24 févr. 2014 à 22:57
0
Merci
Salut à tous et merci pour vos réponses, ucfoutu c'est vrai que cet méthode est beaucoup plus simple que le RegEx, cependant il y a un problème (le même qui m'empêcher de trouver la logique), c'est que si mon mot n'est ni précédé et ni suivi de rien, la détection n'aura pas lieu, et comment faire une sorte de
Like "*[Nothing]con[Nothing]*"
?
Deuxièmement, je pense que je vais être obligé d'utiliser le RegEx afin de splitter mes mots à l'intérieur des phrases.
Merci pour votre aide.
Whismeril 12033 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 25 septembre 2018 Dernière intervention - 24 févr. 2014 à 23:00
J'ai transformé ton commentaire en réponse pour plus de lisibilité.
Pour le spilt, tu peux le faire sans regex comme NHenry l'a proposé.
Commenter la réponse de CLeBeR_FR
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 25/02/2014 à 06:05
0
Merci
Ta question est surprenante, FaonManager ! si rien devant et rien derrière, c'est alors =, non ? ===>>>
toto = "con" or toto like ... etc ...
PS : et juste pour le cas où j'aurais bien deviné ce que tu cherches à faire :
Tu ne devrais avoir aucune réelle difficulté à analyser, comprendre et transposer ceci (écrit en VB6) en VB.Net :
gros_mots = Array("con", "idiot", "abruti")
toto = "con, va! Tu ne sais pas, petit idiot, que pour aller s'abrutir " & _
"avec un autre abruti sur le continent, il ne faut pas être con."
For i = 0 To UBound(gros_mots)
M = gros_mots(i)
L = Len(M)
pos = InStr(toto, M)
Do While pos > 0
av = ""
If pos > 1 Then
av = Mid(toto, pos - 1, 1)
End If
ap = Mid(toto, pos + 0 + L, 1)
Select Case av
Case ",", " ", ".", ";", ""
Select Case ap
Case ",", " ", ".", ";", ""
Mid(toto, pos, L) = String(L, "*")
End Select
End Select
pos = InStr(pos + L, toto, M)
Loop
Next
MsgBox toto


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 25/02/2014 à 08:39
0
Merci
Et si tu crains que la longueur des "***" permette de deviner le gros-mot caché, pas de problème ===>>
il suffit de remplacer la ligne disant :
Mid(toto, pos, L) = String(L, "*")
par
toto = Replace(toto, av & M & ap, av & "#@$&|#" & ap, 1, 1)

Ceci étant dit : tous les galopins du monde ont appris depuis belle lurette à contourner ce genre de censure. Ils se contentent d' "estropier" suffisamment le gros-mot pour qu'il ne soit pas décelable mais qu'il reste "intelligible" ! Exemple : "kon", "khon", "c(on", etc ... pour dire "con".
Conclusion : tu ne parviendras jamais à tout contrôler, tout maîtriser, tout empêcher dans ce domaine.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Commenter la réponse de ucfoutu
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 25 févr. 2014 à 18:26
0
Merci
Bonjour
à tester

 Imports System.Text.RegularExpressions
Private listgrosmots As New List(Of String)
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim txt As String
listgrosmots.Add("con")
listgrosmots.Add("abruti")
listgrosmots.Add("idiot")
listgrosmots.Add("idiote")
listgrosmots.Add("conne")
txt = "sur le continent ,il y a beaucoup de sorte de conniferes "
If DetectGrosMots(txt) Then
MessageBox.Show("gros mots")
Else
MessageBox.Show("pas de gros mots")
End If

txt = "con?? , va! Tu ne sais pas, petite idiote!!, que pour aller s'abrutir "
If DetectGrosMots(txt) Then
MessageBox.Show("gros mots")
Else
MessageBox.Show("pas de gros mots")
End If

txt = "Espece d'""4idiotes"" 10connes "
If DetectGrosMots(txt) Then
MessageBox.Show("gros mots")
Else
MessageBox.Show("pas de gros mots")
End If
txt = "ducon la joie "
If DetectGrosMots(txt) Then
MessageBox.Show("gros mots")
Else
MessageBox.Show("pas de gros mots")
End If
end sub

Private Function DetectGrosMots(ByVal texttocheck As String) As Boolean
Dim items() As String
items = texttocheck.ToLower.Split(New Char() {","c, "."c, "?"c, "!"c, "'"c, " "c}, StringSplitOptions.RemoveEmptyEntries)
myregex = New Regex("[?!s.""0-9]")

For Each item As String In items

item = myregex.Replace(item, "")

If listgrosmots.Contains(item) Then
Return True
End If
Next

Return False
End Function
Commenter la réponse de cs_ShayW
CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 27 février 2018 Dernière intervention - 25 févr. 2014 à 19:01
0
Merci
Merci à tous pour votre aide le code suivant 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 !
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/dotnet/expressions-regulieres/#L3.4.2
http://msdn.microsoft.com/fr-fr/library/system.text.regularexpressions.matchcollection%28v=vs.110%29.aspx
Commenter la réponse de CLeBeR_FR

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.