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