Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / Daten / Strings / InStrWord

Ganze Wörter suchen

Einleitung

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.

Beispiele

MsgBox InStrWord("Hausboot Hochhaus", "haus")    'ergibt 0
MsgBox InStrWord("Ein Haus, wie schön!", "haus") 'ergibt 5

Code / Quelltext

InStrWord

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
IsWordSep

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