User Tools

Site Tools


vba:functions:rx:rx_match_array

First PagePrevious PageBack to overviewNext PageLast Page

[VBA] rx_match_array()

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

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 Global1) auf True
  • rxIgnorCase Setzt IgnorCase2) 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")
<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'
    )
)

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.bas
'/**
' * 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
vba/functions/rx/rx_match_array.txt · Last modified: 09.12.2013 09:39:54 (external edit)