Fast gleich wie rx_match(). Jedoch wird anstelle der MatchCollection ein mehrdimensionaler Array zurückgegeben
Übersicht über alle rx-Funktionen: [VBA] RegExp Functions (RX-Functins)
Für die Ausgabe der Resultate verwendete ich die Funktion [VBA] print_r()
Die Funktion [VBA] rx_match() ist die Grundlage. Ergo mus auch sie vorhanden sein
Fast gleich wie rx_match(). Jedoch wird anstelle der MatchCollection ein mehrdimensionaler Array zurückgegeben
Public Function rx_match_array( _ ByVal iPattern As String, _ ByVal iSubject As String, _ Optional ByVal iFlags As rxFlagsEnum = rxGlobal + rxIgnorCase, _ Optional ByVal iArrayFlags As rxArrayEnum = rxIncludeSubmatches _ ) As Variant()
Setzte die Flags für das RegExp Object. Für das genaue Verhalten bitte die VB-Doku zur RegExp Klasse studieren
Angabe was bei rx_match_array() alles ausgegeben werden soll
Standart ist mit IgnoreCase + Global. Für die Ausgabe nur die Submatches
print_r rx_match_array("(\d+)\.(\d+)CHF", "Die Wurst kostet 6.50chf und das Steak 3.50CHF") <Variant()> ( [0] => <Variant()> ( [0] => <String> '6' [1] => <String> '50' ) [1] => <Variant()> ( [0] => <String> '3' [1] => <String> '50' ) )
Nu auf den ersten Treffer angewendet, dafür jedoch mit Match auf Index 0 und Submatches
print_r rx_match_array("(\d+)\.(\d+)CHF", "Die Wurst kostet 6.50CHF und das Steak 3.50CHF", rxnone, rxIncludeMatch+rxIncludeSubmatches) <Variant()> ( [0] => <String> '6.50CHF' [1] => <String> '6' [2] => <String> '50' )
Und zum Schluss noch alle Funde, jedoch als Ausgabe nur der Match
print_r rx_match_array("(\d+)\.(\d+)CHF", "Die Wurst kostet 6.50CHF und das Steak 3.50CHF", rxGlobal, rxIncludeMatch) <Variant()> ( [0] => <Variant()> ( [0] => <String> '6.50CHF' ) [1] => <Variant()> ( [0] => <String> '3.50CHF' ) )
Der Enumerator rxFlagsEnum wird für alle rx-Funktionen verwendet.
'/** ' * Wird für die rx_ Funktionen verwendet ' * Setzte die Flags für das RegExp Object ' */ Public Enum rxFlagsEnum rxnone = 0 rxGlobal = 2 ^ 0 rxIgnorCase = 2 ^ 1 rxMultiline = 2 ^ 2 End Enum
'/** ' * Wird bei rx_match_array verwendet ' */ Public Enum rxArrayEnum rxIncludeMatch = 2 ^ 0 'Der gefundene Gesammtstring wird mit index 0 zurückgegeben rxIncludeSubmatches = 2 ^ 1 'Die Submatches werden mit ausgegen End Enum '/** ' * Copyright mpl by ERB software | http://wiki.yaslaw.info ' * ' * Eine Erweiterung zu rx_match. Das Resultat wird als Array ausgegeben. ' * @example Set mc = rx_match("([\d\.]+)", "3 Würste unf 4.5 Liter Wasser", pfGlobal) ' * @param String Pattern analog RegExp ' * @param String Der String der bearbeitet werden soll ' * @param rxFlagsEnum Eigenschaften von Regexp. Global, IgnoreCase und Multiline. ' * Die Eigenschaften können mit + kombiniert werden ' * @param rxArrayEnum Angabe was alles ausgegeben werden soll. Die Matches/Submatches ' * Die Auswahl kann mit + kombiniert werden ' * @return MatchCollection ' */ Public Function rx_match_array( _ ByVal iPattern As String, _ ByVal iSubject As String, _ Optional ByVal iFlags As rxFlagsEnum = rxGlobal + rxIgnorCase, _ Optional ByVal iArrayFlags As rxArrayEnum = rxIncludeSubmatches _ ) As Variant() 'Dim mc As MatchCollection: Set mc = rx_match(iPattern, iSubject, iFlags) 'Dim m As Match Dim mc As Object: Set mc = rx_match(iPattern, iSubject, iFlags) Dim m As Object Dim sm() As Variant Dim retArr() As Variant Dim firstIdx As Integer Dim diffIdx As Integer Dim lastIdx As Integer Dim i, k firstIdx = IIf(iArrayFlags And rxIncludeMatch, 1, 0) diffIdx = firstIdx * -1 If iFlags And rxGlobal Then ReDim retArr(mc.count - 1) For i = 0 To mc.count - 1 Set m = mc.Item(i) lastIdx = m.SubMatches.count + firstIdx - 1 If iArrayFlags And rxIncludeSubmatches And m.SubMatches.count > 0 Then ReDim sm(lastIdx) If iArrayFlags And rxIncludeMatch Then sm(0) = m.value For k = firstIdx To lastIdx sm(k) = m.SubMatches(k + diffIdx) Next k ElseIf iArrayFlags And rxIncludeSubmatches Then If iArrayFlags And rxIncludeMatch Then ReDim sm(0): sm(0) = m.value Else Erase sm End If Else ReDim sm(0) sm(0) = m.value End If If iFlags And rxGlobal Then retArr(i) = sm Else retArr = sm End If Next i rx_match_array = retArr Set m = Nothing Set mc = Nothing End Function