Date: 08.05.19 - 11:36pm
One of the most common tasks you will encounter is the need to extract a string fragment from a larger block.
Its a very simple repetitive task and I generally have just done it inline for many many years. The catch is it does require several tests along the way to make sure it is done safely without error on unexpected input.
Years ago I wrote a StringEx class that handled many things including an extract function, yet I rarely use it since it seems to bulky unless I am really doing some heavy duty string parsing.
I finally got tired and just pulled out the extract routine into its own standalone function for general use. Makes extractions nice safe one liners.
Couple notes I left most args variants for flexibility. marker1 or marker2 can be empty and it will use defaults. I decided to return the extracted string length instead of a simple boolean because its a little bit richer feedback that could be useful (if you were expecting a string of min length in return), just remember to test =0 or > 0 instead of the easier if extract() then or if not. Easy to change to your liking.
The output of the below function is s1 = 's1'; m2 = m2
Private Sub Form_Load() Dim m2, s1, pos Const base = "test <m1> 's1' <m2>" If Extract(base, "'", "'", s1, True, , pos) > 0 Then Debug.Print "s1 = " & s1 End If If Extract(base, "<", ">", m2, , pos) > 0 Then Debug.Print "m2 = " & m2 End If End Sub Function Extract(value, marker1, marker2, ByRef outVar, _ Optional includeMarkers As Boolean = False, _ Optional Start = 1, _ Optional ByRef lastPos, _ Optional method As VbCompareMethod = vbBinaryCompare _ ) As Long Dim a As Long, b As Long lastPos = 0 outVar = Empty If Len(marker1) = 0 Then a = 1 Else a = InStr(Start, value, marker1, method) If a < 1 Then Exit Function End If a = a + Len(marker1) If Len(marker2) = 0 Then outVar = Mid(value, a) Else b = InStr(a, value, marker2, method) If b < 1 Then Exit Function lastPos = b + Len(marker2) outVar = Mid(value, a, b - a) End If If includeMarkers Then outVar = marker1 & outVar & marker2 Extract = Len(outVar) End Function
Comments: (2)On 08.08.22 - 4:14pm Dawg wrote:
On 08.08.22 - 4:48pm Dave wrote: