Fonction qui vérifie si un message contient tels mots. [Résolu]

Signaler
Messages postés
59
Date d'inscription
dimanche 29 avril 2007
Statut
Membre
Dernière intervention
21 août 2007
-
Messages postés
59
Date d'inscription
dimanche 29 avril 2007
Statut
Membre
Dernière intervention
21 août 2007
-
Bonjour à tous,
Je débute dans la programmation et j'ai juste l'intention de développer un bot MSN assez simple. J'ai un code source de départ mais j'aimerais savoir s'il existe une fonction qui vérifie si un mot est présent dans la phrase de l'utilisateur au lieu de comparer la phrase entière avec : "CompareIt".
                else if
                (                   msg.CompareTo("salutsava") 0 || msg.CompareTo("sava") 0                || msg.CompareTo("comensava") 0 || msg.CompareTo("commentsava") 0                || msg.CompareTo("cava") 0 || msg.CompareTo("commentvatu") 0                || msg.CompareTo("salutcava") 0 || msg.CompareTo("bonjoursava") 0                || msg.CompareTo("tuvasbien") 0 || msg.CompareTo("tuvabien") 0
                )
                {
                Random rand = new Random(DateTime.Now.Millisecond);
               int value = rand.Next(3);
               if (value == 0) session.send("Moi sa va bien :)");
               else if (value == 1) session.send("Je pete la forme LOL ;)");
               else if (value == 2) session.send("Sa va sa va !!! :)");
                }


Exemple je dis au robot : salut ca va, il réponds => Moi sa va bien (par exemple)
Et quand je lui dis : bjr ca va, il comprends rien => Désolé, je ne comprends pas ...

J'aimerais savoir si je peux remplacer le CompareTo pour simplement vérifier si le mot est présent (ou plusieurs mots) sont présents.
Par exemple, dès qu'il voit que l'utilisateur utilise les mots : "tu" "va" dans n'importe quel sens : le robot peut répondre => ça va !

J'éspère avoir été assez clair pour obtenir de l'aide. Merci d'avance à vous.

17 réponses

Messages postés
303
Date d'inscription
mardi 11 février 2003
Statut
Membre
Dernière intervention
24 avril 2009
5
Hmmm, ya sa qui le fait, mais c pas tres intelligent, car si  tu dit quelquechose comme "Va me chercher du lait, ça serait gentil", eh bah sa va le prendre en compte.

if(  msg.IndexOf("ça") > -1 && msg.IndexOf("va")> -1)

Tu peux toujours faire cela, c'est déjà mieux, ça vérifie que le "va" vient apres le "ça", sauf que encore là, ya possibilité de lire quelquechose comme "ça fait 2 fois qu'il va chercher du lait"
if(  msg.IndexOf("ça") > -1 && msg.IndexOf("va")> msg.IndexOf("ça"))

Alors moi ce que je propose c'est ça:
if(  msg.IndexOf("ça") > -1 && msg.IndexOf("va")> msg.IndexOf("ça") && msg.IndexOf("ça") - msg.IndexOf("va") <= 3 )

Ça régit donc à ce qu'il y ait un espace ou pas entre, et sa s'assur qu'ils se suivent dans la plupart des cas.

Eric
Messages postés
303
Date d'inscription
mardi 11 février 2003
Statut
Membre
Dernière intervention
24 avril 2009
5
petite erreur

if(  msg.IndexOf("ça") > -1 && msg.IndexOf("va")> msg.IndexOf("ça") && msg.IndexOf("va") - msg.IndexOf("ça") <= 3 )

Eric
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Salut,
La class string possède une méthode Contains qui te permet de savoir si une occurance est présente dans ton string (voire également les méthodes IndexOf et compagnies).
Sinon, tu peux aussi regarder du côté des expressions régulières...

<hr />
-Blog-
Messages postés
59
Date d'inscription
dimanche 29 avril 2007
Statut
Membre
Dernière intervention
21 août 2007
7
Ca ça peut marcher ? Eh doucement je débute.

else if
                (                   msg.Contains("salutsava") 0 || msg.CompareTo("sava") 0                || msg.Contains("comensava") 0 || msg.CompareTo("commentsava") 0                || msg.Contains("cava") 0 || msg.CompareTo("commentvatu") 0                || msg.Contains("salutcava") 0 || msg.CompareTo("bonjoursava") 0                || msg.Contains("tuvasbien") 0 || msg.CompareTo("tuvabien") 0
                )
                {
                Random rand = new Random(DateTime.Now.Millisecond);
               int value = rand.Next(3);
               if (value == 0) session.send("Moi sa va bien :)");
               else if (value == 1) session.send("Je pete la forme LOL ;)");
               else if (value == 2) session.send("Sa va sa va !!! :)");
                }
Messages postés
59
Date d'inscription
dimanche 29 avril 2007
Statut
Membre
Dernière intervention
21 août 2007
7
Euh non ça marche pas vraiment... et je ne trouve pas d'aide sur le net à ce sujet.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
msg.Contains("comensava") == 0

=>

msg.Contains("comensava")

<hr />
-Blog-
Messages postés
59
Date d'inscription
dimanche 29 avril 2007
Statut
Membre
Dernière intervention
21 août 2007
7
Dans mon compilateur, j'ai cette erreur après avoir utilisé ce code :

                if
                (
                   msg.Contains("salut")
                )
                {    
               Random rand = new Random(DateTime.Now.Millisecond);
               int value = rand.Next(3); //La valeur max (3 ici) n'est pas pris en compte. Donc .Next(x) et x est le nombre de question ;)
               if (value == 0) session.send("Salut "+session.getUser().getFriendlyName());
               else if (value == 1) session.send("Hello !!!");
               else if (value == 2) session.send("Slt !!! :)");
               }


String does not contain a definition for 'Contains' (CS0117) à la ligne -> msg.Contains("salut") <-
Messages postés
2
Date d'inscription
dimanche 3 juin 2007
Statut
Membre
Dernière intervention
7 juin 2007

La méthode Contains n'est disponible qu'a partir de la v2 du Framework .NET, tu peux télécharger le SDK sur le [http://msdn2.microsoft.com/fr-fr/netframework/aa731542 site de Microsoft[url].

Sinon, à part ça, un conseil quand tu dois comparer des chaines de caractères, utilise la méthode ToLower() car si tu as des caractères en majuscule dans le msg ça n'ira pas.


Ex:
msg.ToLower().Contains("salut");


[ [url=http://blog2baka.goldzoneweb.info]Blog] ]
Messages postés
303
Date d'inscription
mardi 11 février 2003
Statut
Membre
Dernière intervention
24 avril 2009
5
Sinon, tu peux toujours faire


if(  msg.ToLower().IndexOf("salut") > -1 )

qui est l'équivalent de .Contains

Eric
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Arf oui, il fallait dire que tu travaillais avec un framework ancestrale...
Le plus simple reste alors effectivement la méthode IndeOf (comme dit déjà plus haut).

Mais bon, si regardes juste si y'a quelques mot dans une phrase, ton bot ne sera pas très intelligent  

<hr />
-Blog-
Messages postés
59
Date d'inscription
dimanche 29 avril 2007
Statut
Membre
Dernière intervention
21 août 2007
7
C'est toujours mieux que de regarder si la phrase est identique a une enregistré => là il est encore moins inteligent !
Euh enfin si tu me propose une autre méthode je suis preneur ...
J'avais pensé a combiner plusieurs mots comme : "ça" "va" " pour que le robot sache qu'on lui demande s'il va bien.
Je pense utiliser IndexOf puisque j'utilise SDK 1.1 mais comment puis combiner plusieurs mots ?

Pour ce qui est du tolower je n'est pas besoin de le mettre là, c'est déjà prévu au début du script pour que le message devienne en minuscules avec cette même fonction mais merci.
Messages postés
59
Date d'inscription
dimanche 29 avril 2007
Statut
Membre
Dernière intervention
21 août 2007
7
Merci beaucoup Ricklekebekoi pour cette précieuse aide, mon robot va devenir intelligent graçe à toi.
Messages postés
303
Date d'inscription
mardi 11 février 2003
Statut
Membre
Dernière intervention
24 avril 2009
5
de plus, je te conseil au départ de faire un truc du style cela:

msg = msg.Replace(" sa "," ça ").Replace(" ca "," ça ").Replace(" cela "," ça ");

du coup, qu'on écrive:
"salut sa va", "salut, ca va" ou "salut, ça va", toi ensuite t'à qu'a tester le "ça", et a chaque fois que tu voudra tester un "sa/ca/ça/cela", t'aura qu'a tester le "ça" ...

Parce que dieu sait que sur msn ....

Eric
Messages postés
59
Date d'inscription
dimanche 29 avril 2007
Statut
Membre
Dernière intervention
21 août 2007
7
J'avais déjà supprimé avec cette fonction les caracteres spéciaux et les espaces (question de simplicité) mais c'est vrai que ton astuce n'est pas bête ! Merci bien je vais l'essayer.
Messages postés
59
Date d'inscription
dimanche 29 avril 2007
Statut
Membre
Dernière intervention
21 août 2007
7
Ah non finalement, je ne préfère pas l'utiliser car si on veux dire au robot : Espece de salade il va comprendre : espece de calade ...
Messages postés
303
Date d'inscription
mardi 11 février 2003
Statut
Membre
Dernière intervention
24 avril 2009
5
En fait, j'avais mis un espace avant et apres le "sa", soit " sa ", pour éviter cela

Eric
Messages postés
59
Date d'inscription
dimanche 29 avril 2007
Statut
Membre
Dernière intervention
21 août 2007
7
Oui mais : sa maman => ça maman ?
Enfin, le bot avance bien... tu peux le tester si tu veux : robeauf at hotmail.fr (msn)