VBA – Reguläre Ausdrücke (Regex)
In this Article
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.
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:
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:
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:
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
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:
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
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.