version=1.0.0
vdate=03.10.2016
fname=lib_rxlib.bas
ns=%NAMESPACE%
fpath=/vba/functions
====== [VBA] rxMatch() / rxLokup() / rxReplace() ======
Prüft ob ein Value auf ein Pattern passt. Die RegExp-Objekte werden gecached. Interessant für SQL
==Version %%version%% - %%vdate%%==
{{%%fname%%|Download %%fname%% (V-%%version%%)}}
Manchmalwäre es ganz praktisch in SQL mit Regulären Ausdrücken arbeiten zu können. Dazu habe ich eine Funktionssammlung erstellt, die es mit erlaubt genau dies zu tun. Die RegExp-Objekte werden dabei als statische Objekte gespeichert, damit nicht für jede Zeile ein neues Objekt angelegt werden muss.
===== rxMatch() =====
==== Definition ====
Boolean = rxMatch(value [,pattern])
Public Function rxMatch( _
ByVal iValue As Variant, _
Optional ByVal iPattern As String = Empty _
) As Boolean
***iValue** Wert, der geprüft werden soll
***iPattern** Reg-Exp-Pattern gemäss cRx(): [[vba:cast:cregexp#beispiele_mit_patterns_inkl_den_parametern|cRegExp() Beispiele mit Patterns inkl. den Parametern ]]
==== Beispiele rxMatch() ====
SELECT t.*
FROM myTable t
WHERE rxMatch(t.username, '/^ruedi$/i');
ID | USERNAME
---|---------
7 | Ruedi
SELECT t.*
FROM myTable t
WHERE rxMatch(t.username, '/ruedi/i');
ID | USERNAME
---|-----------
4 | Hansruedi
5 | Hans-Ruedi
7 | Ruedi
SELECT t.*,
rxMatch(t.username, '/ruedi/i') AS like_ruedi,
rxMatch(t.username, '/ueli/i') AS like_ueli,
rxMatch(t.username, '/hans/i') AS like_hans,
rxMatch(t.username, '/hans-?(ueli|peter)/i') AS test4
FROM myTable t;
ID | USERNAME | like_ruedi | like_ueli | like_hans | test4
---|------------|------------|-----------|-----------|------
1 | Hans | 0 | 0 | -1 | 0
2 | Hans-Ueli | 0 | -1 | -1 | -1
3 | Hansueli | 0 | -1 | -1 | -1
4 | Hansruedi | -1 | 0 | -1 | 0
5 | Hans-Ruedi | -1 | 0 | -1 | 0
6 | Ueli | 0 | -1 | 0 | 0
7 | Ruedi | -1 | 0 | 0 | 0
8 | Peter | 0 | 0 | 0 | 0
9 | Hanspeter | 0 | 0 | -1 | -1
10 | Hans-Peter | 0 | 0 | -1 | -1
===== rxLookup() =====
==== Definition ====
Result = rxLookup(value [,pattern [,position]])
Public Function rxLookup( _
ByVal iValue As Variant, _
Optional ByVal iPattern As String = Empty, _
Optional ByVal iPosition As Long = 0 _
) As String
***iValue** Wert, der geprüft werden soll
***iPattern** Reg-Exp-Pattern gemäss cRx(): [[vba:cast:cregexp#beispiele_mit_patterns_inkl_den_parametern|cRegExp() Beispiele mit Patterns inkl. den Parametern ]]
***iPosition** Index des SubMatches des ersten Treffers: rxObject.execute(iPattern)(0).SubMatches(iPosition). Bei -1 wird der geammte Treffer ausgegeben
==== Beispiele rxLookup() ====
SELECT t.username, rxLookup(t.username, '/(ruedi)/i') AS Ruedi
FROM myTable t
WHERE rxMatch(t.username, '/(ruedi)/i');
username | Ruedi
-----------|------
Hansruedi | ruedi
Hans-Ruedi | Ruedi
Ruedi | Ruedi
SELECT t.username,
rxLookup(t.username, '/(ns)?([-\s]?)(ruedi)/i', -1) AS fund,
rxLookup(t.username, '/(ns)?([-\s]?)(ruedi)/i', 0) AS treffer_0,
rxLookup(t.username, '/(ns)?([-\s]?)(ruedi)/i', 1) AS treffer_1,
rxLookup(t.username, '/(ns)?([-\s]?)(ruedi)/i', 2) AS treffer_2
FROM myTable t
WHERE rxMatch(t.username, '/(ns)?([-\s])?(ruedi)/i');
username | fund | treffer_0 | treffer_1 | treffer_2
-----------|----------|-----------|-----------|----------
Hansruedi | nsruedi | ns | | ruedi
Hans-Ruedi | ns-Ruedi | ns | - | Ruedi
Ruedi | Ruedi | | | Ruedi
===== rxReplace() =====
==== Definition ====
Result = rxReplace(value [,pattern [,replace]])
Public Function rxReplace( _
ByVal iValue As Variant, _
Optional ByVal iPattern As String = Empty, _
Optional ByVal iReplace As String = Empty _
) As String
***iValue** Wert, der geprüft werden soll
***iPattern** Reg-Exp-Pattern gemäss cRx(): [[vba:cast:cregexp#beispiele_mit_patterns_inkl_den_parametern|cRegExp() Beispiele mit Patterns inkl. den Parametern ]]
***iReplace** Replace-Value geäss RegExp
==== Beispiele rxReplace() ====
SELECT t.username, rxReplace(t.username, '/(hans)([-\s]?)ruedi/i', '$1$2Peter') AS Ruedi
FROM myTable t
WHERE rxMatch(t.username, '/(ruedi)/i');
username | Ruedi
-----------|-----------
Hansruedi | HansPeter
Hans-Ruedi | Hans-Peter
Ruedi | Ruedi
===== Code =====