[<>] ====== [VBA] rx_match_array() ====== Fast gleich wie rx_match(). Jedoch wird anstelle der MatchCollection ein mehrdimensionaler Array zurückgegeben >Übersicht über alle rx-Funktionen: [[..:rx:]] > Für die Ausgabe der Resultate verwendete ich die Funktion [[:vba:functions:print_r:]] > Die Funktion [[.:rx_match]] ist die Grundlage. Ergo mus auch sie vorhanden sein ===== Definition ===== 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() ==== Parameterliste ==== ***iPattern** Pattern analog RegExp ***iSubject** Der String der bearbeitet werden soll ***//iFlags//** Eigenschaften von Regexp. Global, IgnoreCase und Multiline. Die Eigenschaften können mit + kombiniert werden ***//iArrayFlags//** Angabe was alles ausgegeben werden soll. Die Matches/Submatches. Die Auswahl kann mit + kombiniert werden ==== Enumeratoren ==== === rxFlagsEnum === Setzte die Flags für das RegExp Object. Für das genaue Verhalten bitte die VB-Doku zur RegExp Klasse studieren ***rxNone** Alle Parameter werden auf False gesetzt. Wird vor allem zum überschreiben des Standards gebraucht. ***rxGlobal** Setzt Global(([[http://msdn.microsoft.com/en-us/library/tdte5kwf(v=vs.84).aspx|Global Property auf MSDN]])) auf True ***rxIgnorCase** Setzt IgnorCase(([[http://msdn.microsoft.com/en-us/library/wy1d4bz3(v=vs.84).aspx|IgnorCase Property auf MSDN]])) auf True ***rxMultiline** Setzt Multiline auf True === rxArrayEnum === Angabe was bei rx_match_array() alles ausgegeben werden soll ***rxIncludeMatch** Der gefundene Gesammtstring wird mit index 0 zurückgegeben ***rxIncludeSubmatches** Die Submatches werden mit ausgegen * ===== Anwendungsbeispiele ===== 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") ( [0] => ( [0] => '6' [1] => '50' ) [1] => ( [0] => '3' [1] => '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) ( [0] => '6.50CHF' [1] => '6' [2] => '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) ( [0] => ( [0] => '6.50CHF' ) [1] => ( [0] => '3.50CHF' ) ) ===== Code ===== 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 {{tag>vba:Functions vba:RegExp VBA}}