User Tools

Site Tools


vba:tutorials:regexpreplacewithfunction

This is an old revision of the document!


[VBA][Code Pattern] RegExp Replace mit Funktion

Naja, der Titel ist ev. irreführend. Mir kahm aber kein besserer in den Sinn.
Es geht um folgendes: Mittels eines RegExp ermittle ich Teilstrings. Diese sollen über eine Funktion verändert werden und dann im String den Originalteilstring ersetzen.

Ein kleines Beispiel: den folgende String Bären und Hüner gehören nicht in Ämter Jetzt will ich alle äöü und ÜÖÜ in Unicode setzen B\u00E4ren und H\u00FCner geh\u00F6ren nicht in \u00C4mter

Dazu habe ich mal die Funktion [VBA] char2Unicode(), welche mir einen einzelnen Char nach Unicode wandelt.

Mit RegExp.replace() kann ich bekanntlich keine User-Funktion ausführen. Darum löse ich das meistens wie folgt.

Version 1) Funktion mit detailiertem Aufbau

Die folgende Umsetzung beinhaltet eigentlich bereits die ganze Logik. Zum besseren Verständnis sind noch alle Schritte einzel auugeführt

Public Function replUmlaute(ByVal iString As String) As String
    Static rx As regExp         'Das RegExp als Statisch definieren, damit es nicht bei jedem AUfruf initialisiert werden muss
    Dim mc      As MatchCollection
    Dim m       As match
    Dim sm      As subMatches
    Dim unicode As String
 
    If rx Is Nothing Then
        Set rx = New regExp
        rx.pattern = "([äöü])"
        rx.IgnoreCase = True
        'Die folgedne Zeile müsste ich eigentlich nicht setzen.
        'Aber es ist Wichtig, dass Global nicht auf True ist.
        rx.Global = False
    End If
 
    replUmlaute = iString
 
    'Den folgenden Code-Abschnitt ausführen, bis keine Umlaute mehr vorkommen
    Do While rx.Test(replUmlaute)
        'Der erste Treffer wird zurückgegeben
        Set mc = rx.execute(replUmlaute)
        'Wegen global=Off hat die MatchCollection genau einen Match auf der Position 0
        Set m = mc(0)
        'Und einen Submatch auf der Position 0
        Set sm = m.subMatches
        'Den Buchstaben in Unicode wandeln
        unicode = char2unicode(sm(0))
        'und den ersten Treffer mittels RegExp ersetzen
        replUmlaute = rx.Replace(replUmlaute, unicode)
    Loop
End Function

Version 2) Kompakte Version

In dieser Version verzichte ich darauf, alle Schritte einzeln durchzugehen. Auch das ertellen des RegExp überlasse ich der Funktion [VBA] cRegExp() Abgespeckte Version. Dann sieht der Code noch so aus. Ja, der erste ist besser lesbar. Wenn an aber ein Pattern immer wieder verwendet, erkennt man es beim lesen vom Code sofort.

Public Function replUmlaute(ByVal iString As String) As String
    Static rx As Object:    If rx Is Nothing Then Set rx = cRegExp("/([äöü])/i")
 
    replUmlaute = iString
    Do While rx.Test(replUmlaute)
        replUmlaute = rx.Replace(replUmlaute, char2unicode(rx.execute(replUmlaute)(0).subMatches(0)))
    Loop
End Function

Beipiele in Action

In den [VBA] JSON setze ich dieses Pattern mehrfach ein.

vba/tutorials/regexpreplacewithfunction.1417010191.txt.gz · Last modified: 26.11.2014 14:56:31 by yaslaw