|
|
|
|
|
|
Um einen Teil-String in einem anderen String zu ermitteln, wenn die Grenzen nicht als Position, sondern durch einen Anfangs- und einen End-String vorgegeben sind, fehlt eine Funktion in Visual Basic. Ebenfalls zum Ersetzen von Teil-Strings innerhalb von auf solche Weise vorgegebenen Grenzen fehlt.
Zur Ermittlung eines Teil-Strings werden im Prinzip die Positionen des Anfangs- und des End-Strings ermittelt, so dass sich der gesuchte Teil-String mittels der Mid$-Funktion extrahieren lässt. Die folgende Funktion InStrBorders erledigt dies und berücksichtigt dabei wie die InStr-Funktion optional eine Start-Position, ab der der Teil-String gesucht werden soll, als auch die optionale Angabe einer Vergleichsmethode.
Sie übergeben ihr in den ersten drei Parametern den Ausgangs-String, den Anfangs- und den End-String. Da eine Funktion nur einen Wert zurückgeben kann, jedoch nicht zwei Werte, wie hier gesucht (Start- und End-Position), werden diese Werte in den beiden darauffolgenden Parametern StartPos und EndPos zurückgegeben. Der eigentliche Rückgabewert der Funktion (Datentyp Boolean) liefert nur die Information, ob die Suche erfolgreich war. Im weiteren optionalen Parametern Start geben Sie die Startposition für die Suche an (Voreinstellung = 1), und im letzten, ebenfalls optionalen Parameter CompareMethod geben Sie (wie in InStr) die Vergleichsmethode an.
Public Function InStrBorders(Str As String, StartStr As String, _
EndStr As String, Optional StartPos As Long, _
Optional EndPos As Long, Optional ByVal Start As Long = 1, _
Optional ByVal CompareMethod As VbCompareMethod = vbBinaryCompare) _
As Boolean
Dim nEndPos As Long
StartPos = InStr(Start, Str, StartStr, CompareMethod)
If StartPos Then
nEndPos = _
InStr(StartPos + Len(StartStr), Str, EndStr, CompareMethod)
If nEndPos Then
EndPos = nEndPos + Len(EndStr) - 1
InStrBorders = True
End If
End If
End Function
Wenn Sie mit den ermittelten Grenzpositionen (StartPos und EndPos) alleine noch nicht viel anfangen können, sondern lieber gleich den eingegrenzten String erhalten möchten, liefert Ihnen diesen die Funktion InStrBordersStr direkt als Rückgabewert. Die Parameter sind die gleichen. Wenn Sie trotzdem Variablen als optionale Parameter für StartPos und EndPos übergeben, werden Ihnen zusätzlich die Grenzpositionen geliefert.
Public Function InStrBordersStr(Str As String, StartStr As String, _
EndStr As String, Optional StartPos As Long, _
Optional EndPos As Long, Optional ByVal Start As Long = 1, _
Optional ByVal CompareMethod As VbCompareMethod = vbBinaryCompare) _
As String
Dim nEndPos As Long
StartPos = InStr(Start, Str, StartStr, CompareMethod)
If StartPos Then
nEndPos = _
InStr(StartPos + Len(StartStr), Str, EndStr, CompareMethod)
If nEndPos Then
EndPos = nEndPos + Len(EndStr) - 1
InStrBordersStr = Mid$(Str, StartPos, EndPos - StartPos + 1)
End If
End If
End Function
Analog zur Funktion InStrRev (ab VB 6 zur Verfügung), die die Suche in einem gegebenen String vom Ende her beginnt, gibt es die beiden oben stehenden Funktionen auch in den Variationen InStrBordersRev und InStrBordersStrRev. Die Bedeutung der Parameter bleibt wie gehabt. Lediglich die Voreinstellung von des Parameters Start ist hier 0 - die Gesamtlänge des zu durchsuchenden Strings wird als Start-Position angenommen.
Public Function InStrBordersRev(Str As String, StartStr As String, _
EndStr As String, Optional StartPos As Long, _
Optional EndPos As Long, Optional ByVal Start As Long, _
Optional ByVal CompareMethod As VbCompareMethod = vbBinaryCompare) _
As Boolean
Dim nEndPos As Long
If Start = 0 Then
Start = Len(Str)
End If
nEndPos = InStrRev(Str, EndStr, Start, CompareMethod)
If nEndPos Then
StartPos = InStrRev(Str, StartStr, nEndPos - 1, CompareMethod)
If StartPos Then
EndPos = nEndPos + Len(EndStr) - 1
InStrBordersRev = True
End If
End If
End Function
Public Function InStrBordersStrRev(Str As String, _
StartStr As String, EndStr As String, Optional StartPos As Long, _
Optional EndPos As Long, Optional ByVal Start As Long, _
Optional ByVal CompareMethod As VbCompareMethod = vbBinaryCompare) _
As String
Dim nEndPos As Long
If Start = 0 Then
Start = Len(Str)
End If
nEndPos = InStrRev(Str, EndStr, Start, CompareMethod)
If nEndPos Then
StartPos = InStrRev(Str, StartStr, nEndPos - 1, CompareMethod)
If StartPos Then
EndPos = nEndPos + Len(EndStr) - 1
InStrBordersStrRev = _
Mid$(Str, StartPos, EndPos - StartPos + 1)
End If
End If
End Function
Eine Kombination beider Suchrichtungen stellen die beiden folgenden Variationen der oben stehenden Funktionen dar. Bei ihnen wird der Start-String vom Anfang, der End-String jedoch vom Ende des zu durchsuchenden Strings her ermittelt. Zur Angabe der jeweiligen Start-Positionen dienen die beiden optionalen Parameter StartLeft (Voreinstellung = 1) und StartRight (Voreinstellung = 0, also Länge des Ausgangs-Strings), ansonsten sind die Bedeutungen der Parameter unverändert.
Public Function InStrBordersOuter(Str As String, _
StartStr As String, EndStr As String, Optional StartPos As Long, _
Optional EndPos As Long, Optional ByVal StartLeft As Long = 1, _
Optional ByVal StartRight As Long, _
Optional ByVal CompareMethod As VbCompareMethod = vbBinaryCompare) _
As Boolean
Dim nEndPos As Long
StartPos = InStr(StartLeft, Str, StartStr, CompareMethod)
If StartPos Then
If StartRight = 0 Then
StartRight = Len(Str)
End If
nEndPos = InStrRev(Str, EndStr, StartRight, CompareMethod)
If nEndPos Then
EndPos = nEndPos + Len(EndStr) - 1
InStrBordersOuter = True
End If
End If
End Function
Public Function InStrBordersStrOuter(Str As String, _
StartStr As String, EndStr As String, Optional StartPos As Long, _
Optional EndPos As Long, Optional ByVal StartLeft As Long = 1, _
Optional ByVal StartRight As Long, _
Optional ByVal CompareMethod As VbCompareMethod = vbBinaryCompare) _
As String
Dim nEndPos As Long
StartPos = InStr(StartLeft, Str, StartStr, CompareMethod)
If StartPos Then
If StartRight = 0 Then
StartRight = Len(Str)
End If
nEndPos = InStrRev(Str, EndStr, StartRight, CompareMethod)
If nEndPos Then
EndPos = nEndPos + Len(EndStr) - 1
InStrBordersStrOuter = _
Mid$(Str, StartPos, EndPos - StartPos + 1)
End If
End If
End Function
Dem Wunsch, anhand von Grenz-Strings ermittelte Teil-Strings durch einen anderen String ersetzen zu lassen, kommt die Funktion ReplaceInBorders nach. Auch hier geben Sie zunächst den Ausgangs-String, den Start-String und den End-String an. Es folgt der String, der die gefundenen Teil-Strings ersetzen soll. In den weiteren Parametern Start und CompareMethod geben Sie wieder die Start-Position und die Vergleichsmethode an. In Count geben Sie an, wie oft die Ersetzungen erfolgen sollen. Im letzten optionalen Parameter ReplaceMode können Sie angeben, ob die Grenz-Strings mit ersetzt werden sollen, oder ob jeweils nur der tatsächlich dazwischen liegende Teil-String ersetzt werden soll.
Public Function ReplaceInBorders(Str As String, _
StartStr As String, EndStr As String, ReplaceBy As String, _
Optional ByVal Start As Long = 1, Optional ByVal Count As Long, _
Optional ByVal CompareMethod As VbCompareMethod, _
Optional ByVal ReplaceMode As ReplaceModeConstants) As String
Dim nStartPos As Long
Dim nEndPos As Long
Dim nResult As String
Dim nStart As Long
Dim nFound As Boolean
Dim nReplaceLen As Long
Dim nLenStartStr As Long
Dim nLenEndStr As Long
ReplaceInBorders = Str
If Start < 1 Then
nStart = 1
Else
nStart = Start
End If
Select Case ReplaceMode
Case rmBordersIncluded
nReplaceLen = Len(ReplaceBy)
If Count > 0 Then
Do
nFound = InStrBorders(ReplaceInBorders, StartStr, EndStr, _
nStartPos, nEndPos, nStart, CompareMethod)
If nFound Then
ReplaceInBorders = Left$(ReplaceInBorders, nStartPos - 1) _
& ReplaceBy & Mid$(ReplaceInBorders, nEndPos + 1)
nStart = nStartPos + nReplaceLen
Count = Count - 1
If Count = 0 Then
Exit Do
End If
Else
Exit Do
End If
Loop
Else
Do
nFound = InStrBorders(ReplaceInBorders, StartStr, EndStr, _
nStartPos, nEndPos, nStart, CompareMethod)
If nFound Then
ReplaceInBorders = Left$(ReplaceInBorders, nStartPos - 1) _
& ReplaceBy & Mid$(ReplaceInBorders, nEndPos + 1)
nStart = nStartPos + nReplaceLen
Else
Exit Do
End If
Loop
End If
Case rmBetweenBorders
nLenStartStr = Len(StartStr)
nLenEndStr = Len(EndStr)
nReplaceLen = Len(ReplaceBy) + nLenStartStr + nLenEndStr
If Count > 0 Then
Do
nFound = InStrBorders(ReplaceInBorders, StartStr, EndStr, _
nStartPos, nEndPos, nStart, CompareMethod)
If nFound Then
ReplaceInBorders = Left$(ReplaceInBorders, _
nStartPos + nLenStartStr - 1) & ReplaceBy _
& Mid$(ReplaceInBorders, nEndPos - nLenEndStr + 1)
nStart = nStartPos + nReplaceLen
Count = Count - 1
If Count = 0 Then
Exit Do
End If
Else
Exit Do
End If
Loop
Else
Do
nFound = InStrBorders(ReplaceInBorders, StartStr, EndStr, _
nStartPos, nEndPos, nStart, CompareMethod)
If nFound Then
ReplaceInBorders = Left$(ReplaceInBorders, _
nStartPos + nLenStartStr - 1) & ReplaceBy _
& Mid$(ReplaceInBorders, nEndPos - nLenEndStr + 1)
nStart = nStartPos + nReplaceLen
Else
Exit Do
End If
Loop
End If
End Select
End Function
|
|
|