Reguliere expressie in VB: ik kom er maar niet uit.

Status
Niet open voor verdere reacties.

Spades

Gebruiker
Lid geworden
21 jul 2008
Berichten
8
Hallo allemaal!

Ik heb een heel verhaal voor een eenvoudig probleem - denk ik. :confused:

Ik werk momenteel aan een programma dat zich met de Nederlandse taal bezig houdt. Een deel ervan scant teksten op woordpatronen. De woorden van de tekst worden een voor een uit de tekst geplukt en onderworpen aan de patronen. Bij een match worden de gevonden woorden verder verwerkt.
De woordpatronen wisselen voortdurend. Ik kreeg het advies om hiervoor reguliere expressies toe te passen, maar ik ben hier niet goed in. Wie kan mij helpen?

Ik programmeer in Visual Basic 6.0 en maak gebruik van Microsoft VBScript Regular Expressions 5.5. Ik zoek een patroon, dat mij mogelijk maakt om woorden te zoeken die op enig moment op een wisselend aantal plaatsen bepaalde letters bevatten.
Het patroon wordt dynamisch door het programma samengesteld en vervolgens in de reguliere expressie gebruikt: ‘objRegExp.Pattern = myPattern’.

Ter verduidelijking zal ik een (vereenvoudigd) voorbeeld geven. Stel ik heb een bestand genaamd ‘Lijst.txt’. Hierin bevinden zich honderd woorden. Het programma kan dan op enig moment besluiten:

Haal uit de woordenlijst alle woorden die:

- beginnen met een A, op de vierde positie een D hebben, op de achtste positie een E en op de elfde positie een L (hierop zou bijvoorbeeld AARDAPPELPLANT kunnen worden gevonden).

- op de tweede positie een P hebben, op de vijfde een R en op de zesde H (hierop zou bijvoorbeeld OPPERHOOFD kunnen worden gevonden).

- beginnen met een S, op de vierde positie een N hebben, op de achtste positie een M en op de elfde positie een S (hierop zou bijvoorbeeld SLANGENMENS kunnen worden gevonden).

- enz.

De posities waarop in een woord wordt gezocht, evenals de letter waarop wordt gezocht, wisselen dus voortdurend. Ook het aantal posities wisselt en soms sluiten posities op elkaar aan. Ter verduidelijking:
- de ene keer wordt op positie 3 gezocht, de andere keer op positie 5
- de ene keer wordt op positie 2 gezocht naar een A, de andere keer naar een N
- de ene keer wordt op 5 verschillende posities gezocht, de andere keer op 2
- soms wordt gezocht op posities 6 en 7, soms op 2, 3 en 4.

Hierbij zijn de genoemde getallen dus alleen voorbeelden. Ik kom er dus niet uit. :(
Welke tovermeester kan mij helpen? :)
 
Je zou ook gewoon een 'zoekstring' random kunnen laten genereren in een bepaalde vorm '##S##N' en dan een functie kunnen aanroepen die deze verwerkt. (je leest dan elk woord in en vergelijkt eerst de lengte van het huige woord met de lengte van de opgegeven string. Als de lengte gelijk is dan vergelijk of je of elke locatie die geen '#' is gelijk is aan elkaar, als dat zo is dan is er een match gevonden)

Regular expressions zou natuurlijk ook kunnen. :)
 
Ja, dat klopt, leuk bedacht ook! Maar omdat het om vrij veel woorden gaat, zal deze oplossing (te) veel tijd vragen. Dat is niet zo als ik reguliere expressies toepas, heb ik mij laten vertellen. Het schijnt dat iemand die er goed in is, het patroon zo uit zijn mouw schudt. Zo iemand ben ik niet, dus vandaar mijn roep om een beetje hulp. In ieder geval bedankt voor het meedenken! :p
 
Ja, dat klopt, leuk bedacht ook! Maar omdat het om vrij veel woorden gaat, zal deze oplossing (te) veel tijd vragen. Dat is niet zo als ik reguliere expressies toepas, heb ik mij laten vertellen. Het schijnt dat iemand die er goed in is, het patroon zo uit zijn mouw schudt. Zo iemand ben ik niet, dus vandaar mijn roep om een beetje hulp. In ieder geval bedankt voor het meedenken! :p

Iemand die vaker werkt met regex zal het zeker zo uit de mouw kunnen schudden. (en iemand die het niet kent hoeft het alleen maar op te zoeken ;))

Maar verder zijn regular expressions natuurlijk niks magisch. De data moet nog steeds verwerkt worden om te controleren of er aan een voorwaarde wordt voldaan. In jouw project zou je dit zonder al te veel problemen zelf kunnen doen in een kleine lus.

Je zult namelijk sowieso de woorden moeten uitlezen om te controleren of er woorden bijzitten die je nodig hebt. En je zult sowieso een zoek-conditie willen samenstellen waaraan voldaan moet worden. Dan is de extra controle op de lengte en dan eventueel het woord doorlopen niet eens zo gek veel werk extra. (je doorloopt het ingelezen woord en de zoek-conditie gewoon en als het huidige character van de zoekstring niet gelijk is aan '#' dan controleer je of de huidige characters gelijk zijn aan elkaar. In indien ze niet gelijk zijn stel je gewoon een boolean in die je later controleert op zijn waarde.)

( als je toch regular expressions wilt gebruiken dan kun je denk ik het beste even op de MSDN site kijken. )
 
Laatst bewerkt:
en iemand die het niet kent hoeft het alleen maar op te zoeken

Als ik maar wist waar ...

Je zult namelijk sowieso de woorden moeten uitlezen om te controleren of er woorden bijzitten die je nodig hebt.

Klopt, ik doe dat in de routine waarin ik een bestand open en doorloop.

En je zult sowieso een zoek-conditie willen samenstellen waaraan voldaan moet worden.

Precies, en daar wil ik dan de reguliere expressie toepassen met het patroon, dat ik zoek.

Dan is de extra controle op de lengte en dan eventueel het woord doorlopen niet eens zo gek veel werk extra.

Jawel, want RegExp is juist bedoeld om dit sneller te doen - zegt men. Maar ik waardeer je reactie! Het idee is zeker niet slecht!

als je toch regular expressions wilt gebruiken dan kun je denk ik het beste even op de MSDN site kijken.

Heb je een linkje voor me?
 
Jawel, want RegExp is juist bedoeld om dit sneller te doen - zegt men. Maar ik waardeer je reactie! Het idee is zeker niet slecht!

Ik kan het natuurlijk verkeerd hebben, maar ik denk werkelijk dat de implementatie nauwelijks sneller zal zijn. Want wat ik juist probeerde te zeggen is dat de data alsnog verwerkt moet worden, en of je dat nu zelf handmatig doet of je doet het via een regular expression dat maakt weinig uit. En qua code scheelt het in VB net een regel of 4 á 5.


Heb je een linkje voor me?

http://www.google.nl/search?client=...ular+Expressions+5.5&meta=&btnG=Google+zoeken ;)
 
Ja, en die heb ik ook bezocht, sterker nog, die code is standaard. Het gaat dus allleen om dat patroon en als je niet thuis bent in regexp, dan is dat dus niet makkelijk.

Je hoeft heus niet in regex thuis te zijn om de handleiding te kunnen lezen hoor. Je moet er alleen wat moeite voor doen en het gewoon proberen. (op die site staat werkelijk alles wat je nodig hebt; En anders staat heel Google vol met handleidingen/tutorials; )
 
Je hoeft heus niet in regex thuis te zijn om de handleiding te kunnen lezen hoor. Je moet er alleen wat moeite voor doen en het gewoon proberen. (op die site staat werkelijk alles wat je nodig hebt; En anders staat heel Google vol met handleidingen/tutorials; )

En zo zijn we weer terug bij af. IK *snap* het niet. Hoe anders moet ik het nog zeggen? Natuurlijk zit ik die dingen door te kijken, natuurlijk doe ik er moeite voor, maar het lukt me niet. Zullen we het hierbij laten? Ik heb nu een hele berichtenwisseling gevoerd maar schiet zo niet op. :(
 
En zo zijn we weer terug bij af. IK *snap* het niet. Hoe anders moet ik het nog zeggen? Natuurlijk zit ik die dingen door te kijken, natuurlijk doe ik er moeite voor, maar het lukt me niet. Zullen we het hierbij laten? Ik heb nu een hele berichtenwisseling gevoerd maar schiet zo niet op. :(

:cool:

http://support.microsoft.com/kb/818802
http://msdn.microsoft.com/en-us/library/1400241x.aspx


Paste the following code in the Command1_Click event handler:

MsgBox(TestRegExp("is.", "IS1 is2 IS3 is4"))

Note In this example, the is. pattern is checked against the "IS1 is2 IS3 is4" string. You can use the special character period (.) to act as a wildcard character, so that one additional character is matched and displayed with the search pattern. If you add two periods to the search pattern, you see two additional characters. If you do not use any periods, you only see the search pattern.

"is." is hier dus het patroon en "IS1 is2 IS3 is4" is de string die doorzocht moet worden.

Als je naar de tweede link kijkt dan zie je o.a. het volgende:

.

Matches any single character except "\n". To match any character including the '\n', use a pattern such as '[\s\S].

Als het patroon dus 'b.l' zou zijn dan is 'bal' en 'bel' geldig.

Voor jouw programma zou je dan dus een zoek-conditie kunnen samenstellen in de vorm van bijvoorbeeld 'b....n' en dan het ingelezen woord daarmee vergelijken.

( hetgeen ik in het begin zei met 'b####n' is eigenlijk hetzelfde, alleen maak je dan geen gebruik van regex... het is maar goed dat regex zo snel is :p )
 
:cool:

http://support.microsoft.com/kb/818802
http://msdn.microsoft.com/en-us/library/1400241x.aspx




"is." is hier dus het patroon en "IS1 is2 IS3 is4" is de string die doorzocht moet worden.

Als je naar de tweede link kijkt dan zie je o.a. het volgende:



Als het patroon dus 'b.l' zou zijn dan is 'bal' en 'bel' geldig.

Voor jouw programma zou je dan dus een zoek-conditie kunnen samenstellen in de vorm van bijvoorbeeld 'b....n' en dan het ingelezen woord daarmee vergelijken.

( hetgeen ik in het begin zei met 'b####n' is eigenlijk hetzelfde, alleen maak je dan geen gebruik van regex... het is maar goed dat regex zo snel is :p )

NOU snap ik het! Ik had dat met die punten wel gezien, maar ik zocht weer veeeeeel te ver. Hup, even getest en het werkt! :D
Ongeloofelijk, dat het zo simpel is zeg. Hartstikke bedankt, ik had even iemand nodig die me op weg hielp. Nu kan ik mooi aan de slag. Nogmaals bedankt! :thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan