Reguläre Ausdrücke

Ein „regulärer Ausdruck“ (engl. Regular Expression oder kurz RegExp bzw. RegEx) ist eine Folge von Buchstaben und Symbolen, die ein Suchmuster (engl. Pattern) bilden. Diese Suchmuster kann dazu verwendet werden, um Übereinstimmungen in einer anderen Zeichenfolge zu finden. Bei regulären Ausdrücken handelt es sich um eine Metasprache, die von dem Mathematiker und Logiker Stephen Cole Kleene erfunden wurde.

Beispiele:

  • Der reguläre Ausdruck „abk“ wird in abk123, 123abk, 123abkxyz oder in abkürzen gefunden.
  • Es ist es möglich, mit regulären Ausdrücken Begriffe ausfindig zu machen, die mit einem „D“ beginnen und einem „m“ enden.
  • Man kann überprüfen, ob eine E-Mail Adresse bestimmte Vorgaben erfüllt.

Die Anwendungsbereiche für reguläre Ausdrücke sind nahezu unerschöpflich.

Reguläre Ausdrücke sind kein Bestandteil von VBA. Man nutzt stattdessen die Microsoft VBScript Regular Expressions 5.5 – Objektbibliothek. Diese kann wie folgt verfügbar gemacht werden:

Early Binding:

Über das Setzen eines Verweises auf die Bibliothek „Microsoft VBScript Regular Expressions 5.5“. Hierzu im Visual Basic Editor auf  Extras > Verweise > „Microsoft VBScript Regular Expressions 5.5“ gehen.

Durch Klicken auf „Verweise“ erhält man folgendes Menü. Dort das Häkchen bei „Microsoft VBScript Regular Expressions 5.5“ setzen.

Ist der Verweis gesetzt, kann das VBA Regular Expression Objekte wie folgt verwendet werden:
Dim objRegExp As Object            Deklaration des Objekts
Set objRegExp = New RegExp     Zuweisen des RegExp Objekts

Late Binding:

Über die Anweisung CreateObject(„VBScript.RegExp“), z. B.
         

Dim objRegExp as Objekt ' Deklaration des Objektes
Set objRegExp = CreateObject("VBScript.RegExp") ' Zuweisen des RegExp Objekts

Eigenschaften des VBA Regular Expression Objekts sind:

  •  Pattern – Das Muster (engl. Pattern), das für die Suche verwendet werden soll.
  •  IgnoreCase – Wenn True, dann wird die Groß- und Kleinschreibung bei der Suche ignoriert. Wenn False wird die Groß- und Kleinschreibung bei der Suche berücksichtigt.
  •  Global – Wenn True, werden alle Übereinstimmungen des Musters in der Zeichenfolge gefunden. Wenn False, dann wird nur die erste Übereinstimmung gefunden.
  •  MultiLine – Wenn True, erfolgt die Suche über Zeilenumbrüche hinweg. Wenn False, erfolgt die Suche nur in der ersten Zeile.

Methoden des VBA Regular Expression Objekts sind:

  • Test – Sucht nach einem Muster in einer Zeichenfolge und gibt True zurück, wenn eine Übereinstimmung gefunden wird.
  • Ersetzen – Ersetzt die Vorkommen des Musters durch die Ersatzzeichenfolge.
  • Execute – Gibt Übereinstimmungen des Musters mit der Zeichenkette zurück.

Um reguläre Ausdrücke in VBA nutzen zu können, habe ich folgende Funktionen verwendet:

  • GetRegExpMatchValue
  • ReplaceAllByExpression
  • TestRegExpString
  • SplitRe

Diese Funktionen verwenden die Eigenschaften und Methoden des VBA Regular Expression Objekts.

Option Explicit
'
'
Public Function GetRegExpMatchValue(ByVal sPattern As String, sString As String) As String
' Gibt alle Übereinstimmungen der Zeichenfolge „sPattern“ in der Eingabezeichenfolge „sString“ 
' mithilfe eines regulären Ausdrucks zurück
'
Dim objRegExp As Object, Match As Object, Matches As Object, RetStr As String
Set objRegExp = CreateObject("VBScript.RegExp") ' Create a regular expression
objRegExp.ignorecase = False   ' Set case sensitivity
objRegExp.Global = True ' Set global applicability
objRegExp.MultiLine = True
objRegExp.Pattern = sPattern
Set Matches = objRegExp.Execute(sString)
RetStr = ""
For Each Match In Matches
    If Len(RetStr) = 0 Then
       RetStr = Match.Value
      Else
       RetStr = RetStr + "," + Match.Value
    End If
Next
GetRegExpMatchValue = RetStr
'
Set objRegExp = Nothing
Set Matches = Nothing
End Function
'
'
Public Function ReplaceAllByExpression(ByVal sPattern As String, ByVal sString As String, _
                                       ByVal sReplacementText As String) As String
'
' Ersetzt alle Übereinstimmungen der Zeichenfolge „sPattern“ in der Eingabezeichenfolge „sString“ 
'durch „sReplacementText“ mithilfe eines regulären Ausdrucks 
'
Dim objRegExp As Object
Set objRegExp = CreateObject("VBScript.RegExp") ' Create a regular expression
objRegExp.ignorecase = False   ' Set case sensitivity
objRegExp.Global = True        ' Set global applicability
objRegExp.MultiLine = False
objRegExp.Pattern = sPattern
ReplaceAllByExpression = objRegExp.Replace(sString, sReplacementText) ' Replace Methode
'
Set objRegExp = Nothing
End Function
'
'
Public Function TestRegExpString(ByVal sString As String, ByVal sPattern As String) As Boolean
' Testet mithilfe eines regulären Ausdrucks, ob Übereinstimmungen mit der Zeichenfolge „sPattern“ 
' in der Eingabezeichenfolge „sString“ vorhanden sind
'
Dim objRegExp As Object
Set objRegExp = CreateObject("VBScript.RegExp") ' Create a regular expression
objRegExp.ignorecase = True   ' Set case insensitivity
objRegExp.Global = True ' Set global applicability
objRegExp.MultiLine = True
objRegExp.Pattern = sPattern
TestRegExpString = objRegExp.test(sString)
'
Set objRegExp = Nothing
End Function
'
Public Function SplitRe(ByVal sString As String, ByVal sPattern As String) As String()
' Teilt die Zeichenfolge sString am Muster „sPattern“ mithilfe eines regulären Ausdrucks
Dim objRegExp As Object
Set objRegExp = CreateObject("VBScript.RegExp") ' Create a regular expression
objRegExp.Global = True ' Set global applicability
objRegExp.MultiLine = True
objRegExp.ignorecase = True   ' Set case insensitivity
objRegExp.Pattern = sPattern
'SplitRe = Strings.Split(objRegExp.Replace(sString, vbNullChar), vbNullChar)
SplitRe = Strings.Split(objRegExp.Replace(sString, Chr(0)), Chr(0))
' vbNullChar: A character having a value of zero. It is commonly used for adding a C NULL to a string
' or for filling a fixed-length string with zeroes
Set objRegExp = Nothing
End Function

Aufbau von Suchmustern (engl. Patterns)

Ein Suchmuster (engl. Pattern) besteht aus einer Folge von Buchstaben und Symbolen. Es kann dazu verwendet werden, um Übereinstimmungen in einer anderen Zeichenfolge zu finden.

Suchmuster für die Suche nach einzelne Zeichen:

Der einfachste Ausdruck für ein Suchmuster ist ein Buchstabe. Um Ausdrücke in einem Suchmuster zu gruppieren, können runde Klammern ( ) verwendet werden. Die folgende Tabelle enthält Beispiele für Suchmuster für die Suche nach einzelnen Zeichen:

Quantifizierer:

Quantifizierer können verwendet werden, um anzugeben, wie oft das Muster mit der Zeichenfolge übereinstimmen soll.

Anker:

„Anker“ bedeutet, dass das Suchmuster nicht irgendwo im Text stehen darf, um gefunden zu werden. Das Suchmuster sich an einer vorgegebenen Stelle im Text befinden. Die beiden am häufigsten verwendeten Anker sind der Zeilen- bzw. Stringanfang und
das Zeilen- bzw. Stringende.

Anker

Beispiele für die Anwendung von regulären Ausdrücken

In den Beispielen werden die oben angebenen Funktionen verwendet.

Beispiel 1: Uhrzeit aus einem Text extrahieren

Sub UhrzeitExtrahieren()
Dim sPattern As String, sString As String
sPattern = "((0|1)?[0-9]|2[0-3]):([0-5][0-9])"
sString = "Jetzt ist es 11:45 Uhr"
' Uhrzeit im Direktfenster ausgeben
Debug.Print GetRegExpMatchValue(sPattern, sString)
End Sub

Beispiel 2: Datum aus einem Text extrahieren

Sub DatumExtrahieren()
Dim sPattern As String, sString As String
sPattern = "[0-3]?[0-9][/.][0-3]?[0-9][/.](?:[0-9]{2})?[0-9]{2}"
sString = "Heute ist der 3.9.22"
' Datum im Direktfenster ausgeben
Debug.Print GetRegExpMatchValue(sPattern, sString)
End Sub

Schreibe einen Kommentar