VB-Tec.de Visual Basic - Technik, FAQ, Tricks, BeispieleHome / Daten / Strings / InStrWord Ganze Wörter suchen |
Die in VB eingebaute InStr-Funktion erlaubt nur die Suche nach einer bestimmten Buchstabenfolge in einem Text. Oft ist aber nicht jeder Treffer erwünscht, sondern nur diejenigen, welche ein vollständiges, einzeln stehendes Wort bilden. So soll z.B. bei der Suche nach "Haus" nur genau dieser Begriff gefunden werden, nicht aber "Hausboot" oder "Hochhaus".
Mit der unten vorgestellten InStrWord-Funktion wird genau eine solche Wort-Suche ermöglicht. Dazu wird die IsWordSep-Funktion benötigt, welche Word-Trenner erkennt.
MsgBox InStrWord("Hausboot Hochhaus", "haus") 'ergibt 0
MsgBox InStrWord("Ein Haus, wie schön!", "haus") 'ergibt 5
Die Idee ist eigentlich ganz einfach: Es wird im Text mit InStr solange nach dem Wort gesucht, bis das Zeichen direkt vor (und nach) dem gefundenen Wort ein Wort-Trenner (also kein Buchstabe) ist.
Etwas aufpassen muss man am Anfang und Ende des Textes, damit keine unerwünschten VB-Fehlermeldungen erzeugt werden:
Public Function InStrWord( _
ByRef Text As String, _
ByRef Word As String _
) As Long
'Deklarationen:
Dim WordLen As Long
Dim TextEnd As Long
Dim OK As Boolean
WordLen = Len(Word)
If WordLen = 0 Then Exit Function
TextEnd = Len(Text) - WordLen + 1
InStrWord = InStr(1, Text, Word, vbTextCompare)
Do While InStrWord
'Ggf. Zeichen vor dem Wort checken:
If InStrWord = 1 Then
OK = True
Else
OK = IsWordSep(Mid$(Text, InStrWord - 1, 1))
End If
'Ggf. Zeichen hinter dem Wort checken:
If OK And (InStrWord < TextEnd) Then
OK = IsWordSep(Mid$(Text, InStrWord + WordLen, 1))
End If
'Treffer zurückgeben oder weitersuchen:
If OK Then Exit Do
InStrWord = InStr(InStrWord + WordLen, Text, Word, vbTextCompare)
Loop
End Function
Diese Funktion gibt genau dann True zurück, wenn das übergebene Zeichen kein Buchstabe ist, also nicht in einem Wort vorkommen darf:
Public Function IsWordSep(ByVal Char As String) As Boolean
If Len(Char) Then
'Groß- und Kleinschreibung gleich?
If LCase$(Char) = UCase$(Char) Then
'Ausnahme "ß" extra behandeln:
If Char <> "ß" Then IsWordSep = True
End If
End If
End Function
Man beachte, wie durch Nutzung der bei Buchstaben (mit einer einzigen Ausnahme) unterschiedlichen Groß-/Kleinschreibung relativ einfach bestimmt werden kann, ob ein Zeichen ein Word-Trenner ist. Durch diese Methode wird sichergestellt, dass auch nicht-deutsche Buchstaben (z.B. mit Akzente) korrekt erkannt werden.
© Jost Schwider, 31.01.2002-31.01.2002 - http://vb-tec.de/instrwrd.htm