[C#] Regular expression met IRC Bot

Pagina: 1
Acties:

  • dtech
  • Registratie: Juni 2005
  • Laatst online: 19-09 15:37
Hallo,
ik ben als oefening/voor de lol een IRC bot aan het maken, maar bij een bepaalde feature zit ik vast.
Mensen kunnen de bot iets "leren" door te zeggen: "Botnaam: iets is dom"
Als er dan "iets" wordt gezegd zegt de bot: "iets is dom". "Botnaam: rofl is <say> Kom van de vloer af!" resulteerd in "Kom van de vloer af!" als "rofl" wordt gezegd.
Op zich werkt dit prima, maar ik wil graag regular expressions als keywords gebruiken en ik kan geen goede manier bedenken om dat te doen.
Op dit moment zijn alle keys en waarden in een HashTable opgeslagen en bij elk bericht wordt gekeken of dat bericht als key in de hashtable staat. Dit kan natuurlijk niet met regular expressions.
De enige manier die ik kan bedenken is om alle regular expressions in een array te zetten en al deze regular expressions bij elk bericht uit te voeren. Dit lijkt me echter te langzaam en onhandig.
Weet iemand een betere manier?

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Als je compiled regexps gebruikt, dan is dat volgens mij redelijk snel. Die objecten kun je dan in een HashTable opslaan, en die kun je dan gebruiken.

Hier wordt daar wat over uitgelegd: http://www.regular-expressions.info/dotnet.html

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:10

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik snap het idee van de regex in de hashtable niet echt... Ga gewoon de strings tokenizen (dat kan evt met een regex) zodat je de individuele woorden hebt. Als dat begint met "Botnaam:" is het een commando dan parse je die, zo niet dan kijk je voor elk woord of er iets mee gedaan moet worden (via een hashtable bijvoorbeeld)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • T_E_O
  • Registratie: Oktober 1999
  • Laatst online: 03-10 11:32
En als iemand nu "Botnaam: Botnaam: is doen" zegt, kan je 'm dan nog nieuwe dingen leren ? :)

  • dtech
  • Registratie: Juni 2005
  • Laatst online: 19-09 15:37
@compufreak
Ik zal even naar die compiled commands geven

@.oisyn
Botnaam: is enkel om de bot te leren. Wat ik nu heb is zoiets. Stel dat de hastable er zo uit ziet:
code:
1
2
3
"rofl" => "Ga van de vloer af!"
".oisyn location" => "Ergens in Nederland"
"GoT" => "http://gathering.tweakers.net/"

Dan kan de conversatie er zo uit zien:
code:
1
2
3
4
5
6
A: En toen sprong ik snel weg!
B: rofl
Bot: Ga van de vloer af!
B: Hee, dat heb ik net gezien op, hoe heet dat ook alweer:
A: GoT
Bot: http://gathering.tweakers.net/

Dit werkt gewoon.
Ik wil nu echter hetzelfde kunnen doen met reguliere expressies, ik wil bijvoorbeeld het volgende kunnen doen:
code:
1
2
3
4
5
6
"(jij|je) bent ([a-z! _-]{3,*})" => "Je moeder is \2"

B: Wat een stom argument
C: Je begrijpt het toch niet
C: Je bent een pukkeputtel!
Bot: Je moeder is een pukkeputtel!

[ Voor 0% gewijzigd door dtech op 15-06-2008 16:29 . Reden: Ik kan natuurlijk niet gathering fout spellen ]


  • dtech
  • Registratie: Juni 2005
  • Laatst online: 19-09 15:37
T_E_O schreef op zondag 15 juni 2008 @ 16:19:
En als iemand nu "Botnaam: Botnaam: is doen" zegt, kan je 'm dan nog nieuwe dingen leren ? :)
Haha, goede. Ik heb het net geprobeerd en hij blijft het gewoon doen zoals verwacht. Hij kijkt namelijk of het eerste woordt "Nick:" is, als dat zo is kijkt hij eerst of er commando's in staan (help etc.) en dan pas gaat hij kijken of er iets te leren valt. Pas als het bericht niet begint met "Nick:" kijkt hij in de hashtable.

[ Voor 7% gewijzigd door dtech op 15-06-2008 16:32 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:10

.oisyn

Moderator Devschuur®

Demotivational Speaker

dtech schreef op zondag 15 juni 2008 @ 16:28:
Ik wil nu echter hetzelfde kunnen doen met reguliere expressies, ik wil bijvoorbeeld het volgende kunnen doen:
code:
1
2
3
4
5
6
"(jij|je) bent ([a-z! _-]{3,*})" => "Je moeder is \2"

B: Wat een stom argument
C: Je begrijpt het toch niet
C: Je bent een pukkeputtel!
Bot: Je moeder is een pukkeputtel!
Ah nu snap ik het. De opmerking van compufreak bracht me op het verkeerde been. Z'n opmerking is overigens onzin, want het idee van een hashtable is dat je snel kan zoeken door een hash te genereren van de key. Nou kun je dat natuurlijk ook wel van een regex doen, maar het idee is niet dat de regex een key is, maar dat de regex wordt om de key te controleren.

Je kunt het wel anders doen dan via een array, namelijk door alle regexen te combineren en daar een nieuwe van te maken, waarbij die regex natuurlijk ook aangeeft welke subregex de juiste was. Ik denk echter niet dat dit met de standaard regex class in .Net te doen is, dus dan zul je je eigen regex implementatie moeten schrijven. En dat is een beetje overkill, want al die regexen apart van elkaar over de string heen gooien is helemaal niet zo'n dure operatie (zolang je ze maar één keer compileert natuurlijk, en niet elke keer een regex bouwt van de source string)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
.oisyn schreef op zondag 15 juni 2008 @ 16:44:
[...]

Ah nu snap ik het. De opmerking van compufreak bracht me op het verkeerde been. Z'n opmerking is overigens onzin, want het idee van een hashtable is dat je snel kan zoeken door een hash te genereren van de key. Nou kun je dat natuurlijk ook wel van een regex doen, maar het idee is niet dat de regex een key is, maar dat de regex wordt om de key te controleren.
Excuse-moi. Ik nam gewoon zijn voorbeeld van de hashtable over. Had ik even wat beter over moeten nadenken.

Maar wat je imo kan doen is een lijst met regexpen combineren met een lijst met bijhorende antwoorden, waarbij je de back-references kan gebruiken om variabele onderdelen te pakken te krijgen.

Echter ik geloof dat .net geen back-references ondersteund op de manier waarop php dat doet. Maar daar is wel zelf een simpele functie voor te schrijven.
Pagina: 1