[<>] ====== [VBA] rx_choose() ====== Gibt einen Teil der Treffer aus [[.:rx_match]] zurück. >Ü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. >Wenn man das ganze Modul aus [[vba:functions:rx:index]] importiert hat man das automatisch mit dabei ===== Definition ===== Public Function rx_choose( _ ByVal iPattern As String, _ ByVal iSubject As String, _ Optional ByVal iMatchIndex As Integer = 1, _ Optional ByVal iSubMatchIndex As Integer = 0, _ Optional ByVal iFlags As rxFlagsEnum = rxglobal + rxIgnorCase _ ) As Variant ==== Parameterliste ==== ***iPattern** Pattern(([[http://msdn.microsoft.com/en-us/library/f97kw5ka(v=vs.84).aspx|Pattern Property auf MSDN]])) analog RegExp ***iSubject** Der String der bearbeitet werden soll ***//iMatchIndex //** Nummer des Matches der zurückgegeben werden soll. Die Zählung beginnt mit 1. Standard ist 1 ***//iSubMatchIndex //** Nummer des SubMatches der zurückgegeben werden soll. Die Zählung beginnt mit 1. Der Index 0 gibt den gesamten Match zurück. Standard ist 0 ***//iFlags//** Eigenschaften von Regexp. Global, IgnoreCase und Multiline. Die Eigenschaften können mit + kombiniert werden. Siehe dazu die Doku zu dem Emurator [[#rxFlagsEnum]] ==== 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 ===== Anwendungsbeispiele ===== Ich mache hier mal einige Beispiele immer mit denselben Pattern und Subjekt. Zuerst mal eine Aufstellung der Matches 'Die Analyse des Patterns mit dem Subjekt für die unten stehenden Beispiele print_r rx_match("((\d+)\.(\d*))CHF", "13.4CHF + 4.6CHF + 56.5CHF") ( [0] => ( [Match] => '13.4CHF' [0] => '13.4' [1] => '13' [2] => '4' ) [1] => ( [Match] => '4.6CHF' [0] => '4.6' [1] => '4' [2] => '6' ) [2] => ( [Match] => '56.5CHF' [0] => '56.5' [1] => '56' [2] => '5' ) ) Hier nun einige Beispiele um aufzuzeigen wei das mit den 2 Indexen funktioniert 'Erster Submatch des 2ten Matches debug.print rx_choose("((\d+)\.(\d*))", "13.4CHF + 4.6CHF + 56.5CHF", 2, 1) 4.6 'Und die Vorkommastellen (2tes Submatch) des 3ten Matches debug.print rx_choose("((\d+)\.(\d*))", "13.4CHF + 4.6CHF + 56.5CHF", 3, 2) 56 'Noch die Nachkommastellen des ersten Matches debug.print rx_choose("((\d+)\.(\d*))", "13.4CHF + 4.6CHF + 56.5CHF", , 3) 4 'Zuletzt noch ein Beispiel das nix zurückgeben kann debug.print rx_choose("ABC", "13.4CHF + 4.6CHF + 56.5CHF") False Dann gibt es noch ein Spezialfall. Wenn iSubMatchIndex 0 ist, wird der gesamte Match zurückgegeben debug.print rx_choose("((\d+)\.(\d*))CHF", "13.4CHF + 4.6CHF + 56.5CHF", 2, 0) 4.6CHF Dann gibt es noch ein Spezialfall. Wenn iSubMatchIndex 0 ist, wird der gesamte Match zurückgegeben debug.print rx_choose("((\d+)\.(\d*))CHF", "13.4CHF + 4.6CHF + 56.5CHF", 2, 0) 4.6CHF 'Da bei iSubMatchIndex 0 als Standard ist, kann an so auf den ersten Match zugreifen 'In dem Beispiel Gibt es keine Submatches, da der Pattern keine () besitzt. debug.print rx_choose("\d+\.\d*CHF", "13.4CHF + 4.6CHF + 56.5CHF") 13.4CHF ===== 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 '/** ' * Copyright mpl by ERB software | http://wiki.yaslaw.info ' * ' * Extrahiert einen Submatch aus einem String ' * @example monat = print_r rx_choose("(\d{0,2})\.(\d{0,2})\.(\d{0,4})", "01.02.2013", 2) ' * @param String Pattern analog RegExp ' * @param String Der String der bearbeitet werden soll ' * @param Integer Match von dem das Subitem ausgegeben werden soll. Beginnt mit 1 ' * @param Integer SubMatch der ausgegeben werden soll. Bei 0 wird der gesammte Match ausgegeben Beginnt mit 0 ' * @param rxFlagsEnum Eigenschaften von Regexp. Global, IgnoreCase und Multiline. ' * Die Eigenschaften können mit + kombiniert werden ' * @return Wert oder False ' */ Public Function rx_choose( _ ByVal iPattern As String, _ ByVal iSubject As String, _ Optional ByVal iMatchIndex As Integer = 1, _ Optional ByVal iSubMatchIndex As Integer = 0, _ Optional ByVal iFlags As rxFlagsEnum = rxglobal + rxIgnorCase _ ) As Variant Dim mc As Object Dim idxSM As Integer: idxSM = iSubMatchIndex - 1 Dim idxM As Integer: idxM = iMatchIndex - 1 Set mc = rx_match(iPattern, iSubject, iFlags) If Not mc Is Nothing Then If mc.count > idxM And idxM >= 0 Then If idxSM = -1 Then rx_choose = mc.Item(idxM) GoTo Exit_Handler ElseIf mc.Item(idxM).SubMatches.count > idxSM And idxSM >= 0 Then rx_choose = mc.Item(idxM).SubMatches(idxSM) GoTo Exit_Handler End If End If End If rx_choose = False Exit_Handler: Set mc = Nothing End Function {{tag>vba:Functions vba:RegExp VBA}}