[<>]
====== [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}}