Rückkehr in VBA-Code-Beispiele

VBA – Reguläre Ausdrücke (Regex)

In diesem Tutorial wird gezeigt, wie man Reguläre Ausdrücke in VBA verwendet.

Was ist Regex?

Regex steht für regulärer Ausdruck (engl. Regular Epression). Ein regulärer Ausdruck ist ein Muster, das aus einer Folge von Zeichen besteht, die Sie verwenden können, um ein passendes Muster in einer anderen Zeichenfolge zu finden. Um Regex in VBA zu verwenden, müssen Sie das RegExp-Objekt verwenden.

Ein Muster wie [A-C] kann verwendet werden, um einen Großbuchstaben von A bis C in einer Folge zu suchen und zu finden. Regex-Muster haben eine eigene Syntax und können aus einem Zeichen oder einer Folge von Zeichen gebildet werden.

Übereinstimmende Zeichen

Die folgende Tabelle zeigt die Syntax, mit der Sie Regex-Muster erstellen können.

Muster-Syntax Beschreibung Beispiel Gefundene Übereinstimmungen
. Entspricht jedem einzelnen Zeichen außer vbNewLine f.n fan, fon, f@n, fwn
[characters] Entspricht jedem beliebigen einzelnen Zeichen zwischen eckigen Klammern[] [fn] Würde nur mit „f“ oder „n“ in Fan übereinstimmen
[^characters] Entspricht jedem beliebigen einzelnen Zeichen, das nicht zwischen eckigen Klammern steht[] [^fn] Würde also mit „j“ in „fjn“ übereinstimmen
[start-end] Entspricht jedem Zeichen, das Teil des Bereichs in Klammern ist[] [1-5] Würde mit „4“ und „5“ in „45“ übereinstimmen
\w Entspricht alphanumerischen Zeichen und dem Unterstrich, aber nicht dem Leerzeichen \w Würde mit „c“ in „,c“ übereinstimmen
\W Entspricht allen nicht alphanumerischen Zeichen und dem Unterstrich \W Würde mit „@“ in „bb@bb“ übereinstimmen
\s Entspricht allen „Weißzeichen“ wie Leerzeichen und Tabulatoren \s Würde mit “ “ in „Dies ist“ übereinstimmen
\S Entspricht jedem Zeichen, das kein Leerzeichen ist \S Würde mit „T“ und „h“ in „T h“ übereinstimmen
\d Entspricht jeder einzelnen Dezimalziffer \d Würde mit „7“ in „a7h“ übereinstimmen
\D Entspricht jedeR einzelnen nicht-dezimalen Ziffer \D Würde mit j in „47j“ übereinstimmen
\ Umgeht Sonderzeichen und ermöglicht damit die Suche nach ihnen \. Würde mit „.“ in „59.pQ“ übereinstimmen
\t Tabulator \t Würde mit einem Tabulatorzeichen übereinstimmen
\r Zeilenumbruch \r Würde mit einem Zeilenumbruch (vbCr) übereinstimmen
\n vbNewLine(vbTab) \n Würde mit einer neuen Zeile übereinstimmen

Quantifizierer

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

Quantifizierer Beschreibung Beispiel Gefundene Übereinstimmungen
* Findet null oder mehr Vorkommen fn*a fna, fa, fnna, fnnna, fnfnnna
+ Entspricht einem oder mehreren Vorkommen fn+a fna, fnna, fnfnna
? Trifft auf null oder eins zu fn?a fa, fna
{n} Trifft „n“ mehrmals zu d\W{4} Würde mit „d….“ in „d….&5hi“ übereinstimmen
{n,} Stimmt mindestens „n“ Male überein d\W{4,} Würde mit „d….&“ in „d….&5hi“ übereinstimmen
{n,m} Stimmt zwischen n und m Male überein d\W{1,8} Würde mit „d….&&&&“ in „d….&&&&5hi“ übereinstimmen

Gruppieren

Die Gruppierung oder Erfassung ermöglicht es Ihnen, ein Muster zu verwenden, um einen Teil einer Zeichenfolge zu erfassen und zu extrahieren. Es wird also nicht nur das Muster abgeglichen, sondern auch der Teil der Zeichenkette erfasst, der mit dem Muster übereinstimmt.

Muster Beschreibung Beispiel Gefundene und erfasste Übereinstimmungen
(Ausdruck) Gruppiert und erfasst das Muster in Klammern (\W{4}) Würde „@@@@“ aus „1@@@@1jlmba“ gruppieren und erfassen

Wie man Regex in VBA verwendet

Um Regex in VBA zu verwenden, müssen Sie zunächst den Bezug im VBE-Editor herstellen. Gehen Sie dazu im VBE-Editor auf Extras > Verweise > Microsoft VBScript Regular Expressions.

referenz regulaere ausdruecke hinzufuegen

Dies sind die Eigenschaften des RegExp-Objekts:

  • Muster – Das Muster, das für den Abgleich mit der Zeichenfolge verwendet werden soll.
  • IgnoreCase – Wenn True, dann wird die Groß- und Kleinschreibung beim Abgleichen ignoriert.
  • 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 der Musterabgleich über Zeilenumbrüche hinweg.

Dies sind die Methoden des RegExp-Objekts:

  • 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.

Testen eines Musters auf Übereinstimmung mit einer Zeichenkette

Mit der Methode „Test“ können Sie prüfen, ob ein Muster mit einer Sequenz in der Eingabezeichenkette übereinstimmt. Das Ergebnis ist True, wenn eine Übereinstimmung gefunden wird. Der folgende Code zeigt Ihnen, wie Sie ein Muster gegen eine Zeichenkette testen können:

Sub RegexEinMusterTesten()

Dim stringEins As String
Dim regexEins As Object
Set regexEins = New RegExp

regexEins.Pattern = "f....a"

stringEins = "000111fjo88a8"

Debug.Print regexEins.Test(stringEins)

End Sub

Das Ergebnis ist:

muster testen mit regulaeren ausdruecken

Ersetzen eines Musters in einer Zeichenkette

Sie können die Replace-Methode verwenden, um die erste Instanz eines übereinstimmenden Musters in einer Zeichenkette oder alle Instanzen eines übereinstimmenden Musters in einer Zeichenkette zu ersetzen. Wenn Global auf False gesetzt ist, wird nur die erste Instanz ersetzt. Der folgende Code zeigt Ihnen, wie Sie ein Muster in einer Zeichenkette ersetzen können:

Sub RegexEinMusterErsetzen()
Dim stringEins As String
Dim regexEins As Object
Set regexEins = New RegExp

regexEins.Pattern = "Das ist die neue Zahl: "
regexEins.Global = False
stringEins = "Das ist die neue Zahl: 718901"

Debug.Print regexEins.Replace(stringEins, "Das ist die Zahl")
End Sub

Das Ergebnis ist:

zeichenfolge mit regulaeren ausdruecken ersetzen

Um nur den Zahlenteil der oben verwendeten Zeichenkette zu ersetzen, würden Sie den folgenden Code verwenden:

Sub RegexEinMusterErsetzen()
Dim stringEins As String
Dim regexEins As Object
Set regexEins = New RegExp

regexEins.Pattern = "[^\D]+"
regexEins.Global = False
stringEins = "Das ist die Zahl 718901"

Debug.Print regexEins.Replace(stringEins, "777192")
End Sub

Das Ergebnis ist:

zahlenteil zeichenkette mit regulaeren ausdruecken ersetzen

Um jede Instanz eines bestimmten Musters in einer Zeichenfolge zu ersetzen, setzen Sie den globalen Wert auf True. Der folgende Code zeigt Ihnen, wie Sie jede Instanz von -A1289C- in der Zeichenkette ersetzen können:

Sub RegexJedeInstanzInMusterErsetzen()
Dim stringEins As String
Dim regexEins As Object
Set regexEins = New RegExp

regexEins.Pattern = "\W\A\d+C\W"
regexEins.Global = True
stringEins = "ABC-A1289C-ABC-A1289C-ABC"

Debug.Print regexEins.Replace(stringEins, "IJK")
End Sub

alle zeichenfolgeninstanzen mit regulaeren ausdruecken ersetzen

Abgleichen und Anzeigen eines Musters in einer Zeichenkette

Sie können die Execute-Methode verwenden, um eine oder alle Instanzen eines Musters in einer Zeichenkette abzugleichen. Der folgende Code zeigt Ihnen, wie Sie alle Instanzen des Musters in der Zeichenkette abgleichen und anzeigen können:

Sub RegexMusterAbgleichenUndAnzeigen()
Dim stringEins As String
Dim regexEins As Object

Set regexEins = New RegExp

regexEins.Pattern = "A.C"
regexEins.Global = True
regexEins.IgnoreCase = IgnoreCase
stringEins = "ABC-A1289C-ADC-A1289C-AJC"

Set dieTreffer = regexEins.Execute(stringEins)

For Each Match In dieTreffer
  Debug.Print Match.Value
Next

End Sub

Das Ergebnis ist:

Abgleichen erfassen muster zeichenkette regulaere ausdruecke

Nehmen wir an, wir wollen nur -ADC- aus der obigen Zeichenfolge abgleichen. Der folgende Code zeigt, wie man nur -ADC- aus der Zeichenkette abgleichen und anzeigen kann:

Sub RegexMusterAbgleichenUndAnzeigen()
Dim stringEins As String
Dim regexEins As Object

Set regexEins = New RegExp

regexEins.Pattern = "\-\A.C\-"
regexEins.Global = False
regexEins.IgnoreCase = IgnoreCase
stringEins = "ABC-A1289C-ADC-A1289C-AEC"

Set dieTreffer = regexEins.Execute(stringEins)

For Each Match In dieTreffer
  Debug.Print Match.Value
Next

End Sub

muster erfassen mit regulaeren ausdruecken

Regex kann einige Zeit in Anspruch nehmen, um  gelernt zu werden, aber es ist ein extrem leistungsfähiges Werkzeug für die Identifizierung/Manipulation von Textstrings. Es wird auch in vielen Programmiersprachen verwendet.