Comparer deux mots avec exactitude

Résolu
Utilisateur anonyme - 24 févr. 2014 à 21:11
 Utilisateur anonyme - 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 !

9 réponses

Whismeril
Messages postés
17481
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
2 juillet 2022
600
24 févr. 2014 à 21:24
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.
0
NHenry
Messages postés
14942
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
2 juillet 2022
161
24 févr. 2014 à 21:28
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.
0
cs_ShayW
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
56
24 févr. 2014 à 22:15
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
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Modifié par ucfoutu le 24/02/2014 à 22:29
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
0
Whismeril
Messages postés
17481
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
2 juillet 2022
600
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.
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
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).
0
Whismeril
Messages postés
17481
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
2 juillet 2022
600
24 févr. 2014 à 23:01
Oui d'ailleurs t'es pas en arrêt maladie?
0

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

Posez votre question
Utilisateur anonyme
24 févr. 2014 à 22:57
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.
0
Whismeril
Messages postés
17481
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
2 juillet 2022
600
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é.
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Modifié par ucfoutu le 25/02/2014 à 06:05
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
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Modifié par ucfoutu le 25/02/2014 à 08:39
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
0
cs_ShayW
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
56
25 févr. 2014 à 18:26
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
0
Utilisateur anonyme
25 févr. 2014 à 19:01
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
0