|
Wie würden Sie prüfen, ob ein gegebener String ausschließlich aus einem gegebenen Satz bestimmter Zeichen besteht? Eine der gängigsten Lösungen prüft der Reihe nach per InStr für jedes Zeichen des Strings, ob es sich in der gegebenen Zeichenmenge befindet:
Public Function HasValidChars(Text As String, CharList As String) _
As Boolean
Dim l As Long
For l = 1 To Len(Text)
If InStr(CharList, Mid$(Text, l, 1)) = 0 Then
Exit Function
End If
Next 'l
HasValidChars = True
End Function
Auch wenn Visual Basic selbst keine echte Validierung so genannter "regulärer Ausdrücke" bietet, so ermöglicht der Like-Operator doch immerhin eine ganze Menge ähnlicher Vergleiche. So können Sie von ihm auch die gewünschte Prüfung vornehmen lassen. Sie sieht zwar wegen der doppelten Umkehrung etwas verquer aus, erfüllt aber genau ihren Zweck. Bei der Zusammenstellung der zulässigen Zeichenmenge (CharList) gelten die Regeln, über die Sie in der VB-Hilfe zum Like-Operator mehr erfahren.
Public Function LikeValidChars(Text As String, CharList As String) _
As Boolean
LikeChars = Not Text Like "*[!" & CharList & "]*"
End Function
Die Geschwindigkeit der Prüfung über den Like-Operator ist relativ konstant - die Länge des zu prüfenden Textes spielt nur eine unwesentliche Rolle. Sie werden sicher leicht nachvollziehen können, dass dagegen die Prüfungsdauer bei der Eingangs vorgestellten Prüfung über InStr linear mit der Länge des zu prüfenden Textes wächst.
Im Normalfall hat die Like-Variante in der oben vorgestellten Form noch einen kleinen Nachteil: Sie müssten sowohl Klein- als auch Großbuchstaben in die Zeichenmenge aufnehmen, wenn beide erlaubt sein sollen. "Normalfall" heißt, dass die Standard-Vergleichsmethode (der binäre Vergleich) nicht durch eine explizite Einstellung in dem Modul, in dem die Like-Operation stattfindet, geändert worden ist - etwa durch ein "Option Compare Text" im Modul-Kopf.
Mittels dieser Einstellung können Sie jedoch auch ganz bewusst dafür sorgen, dass Groß- und Kleinbuchstaben gleichermaßen gültig sein sollen. Um die Kontrolle vollkommen in der Hand zu behalten und dynamisch zwischen binärer und textueller Vergleichsmethode wählen zu können, verwenden Sie am besten mehrere Standard-Module. In einem Standard-Modul, in dem die Voreinstellung der Vergleichsmethode unverändert bleibt, befindet sich die Variante der Funktion, die für den stringenten binären Vergleich zuständig sein soll:
Public Function ValidCharsBin(Text As String, CharList As String) _
As Boolean
ValidCharsBin = Not Text Like "*[!" & CharList & "]*"
End Function
In einem zweiten Standard-Modul befindet sich die Variante für den textuellen Vergleich. Hier wird die Vergleichsmethode explizit auf "Text" gestellt:
Option Compare Text
Public Function ValidCharsText(Text As String, CharList As String) _
As Boolean
ValidCharsText = Not Text Like "*[!" & CharList & "]*"
End Function
Diese beiden Varianten können Sie nun gezielt aufrufen. Nun können Sie noch, etwa in einem dritten Standard-Modul, eine allgemeine Aufrufvariante anlegen, bei der über einen (optionalen) Parameter die Vergleichsmethode festgelegt werden kann:
Public Enum vchCompareMethodConstants
vchBinaryCompare
vchTextCompare
End Enum
Public Function ValidChars(Text As String, CharList As String, _
Optional ByVal CompareMethod As vchCompareMethodConstants _
= vchBinaryCompare)
If CompareMethod = vchTextCompare Then
ValidChars = ValidCharsText(Text, CharList)
Else
ValidChars = ValidCharsBin(Text, CharList)
End If
End Function
|