User Tools

Site Tools


vba:functions:rx:rx_choose

Back to overviewNext PageLast Page

[VBA] rx_choose()

Gibt einen Teil der Treffer aus [VBA] rx_match() zurück.

Ü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.
Wenn man das ganze Modul aus [VBA] RegExp Functions (RX-Functins) 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 Pattern1) 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 Global2) auf True
  • rxIgnorCase Setzt IgnorCase3) 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")
<IMatchCollection2> (
    [0] => <IMatch2> (
        [Match] => <String> '13.4CHF'
        [0] => <String> '13.4'
        [1] => <String> '13'
        [2] => <String> '4'
    )
    [1] => <IMatch2> (
        [Match] => <String> '4.6CHF'
        [0] => <String> '4.6'
        [1] => <String> '4'
        [2] => <String> '6'
    )
    [2] => <IMatch2> (
        [Match] => <String> '56.5CHF'
        [0] => <String> '56.5'
        [1] => <String> '56'
        [2] => <String> '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
rx_choose.bas
'/**
' * 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
vba/functions/rx/rx_choose.txt · Last modified: 26.08.2014 16:10:24 by yaslaw