Wie kann ich reguläre Ausdrücke in Excel verwenden und das leistungsstarke gitterartige Setup von Excel für die Datenmanipulation nutzen?
- In-Cell-Funktion zum Zurückgeben eines übereinstimmenden Musters oder eines ersetzten Werts in einer Zeichenfolge.
- Sub, um eine Datenspalte zu durchlaufen und Übereinstimmungen mit benachbarten Zellen zu extrahieren.
- Welches Setup ist notwendig?
- Was sind die Sonderzeichen von Excel für reguläre Ausdrücke?
Ich verstehe Regex für viele Situationen nicht ideal ist ( oder nicht verwendet reguläre Ausdrücke verwenden? ) , Da Excel verwenden kann Left
, Mid
, Right
, Instr
Typ Befehle für ähnliche Manipulationen.
Like
Operator , der eine Art leichte Version der Regex-Funktionalität bietet. Es ist normalerweise viel schneller als Regex, selbst wenn es in eine Unter- oder Funktionsprozedur eingeschlossen ist.Antworten:
Reguläre Ausdrücke werden für die Musterübereinstimmung verwendet.
Gehen Sie folgendermaßen vor, um Excel zu verwenden:
Schritt 1 : Fügen Sie einen VBA-Verweis auf "Microsoft VBScript Regular Expressions 5.5" hinzu.
Schritt 2 : Definieren Sie Ihr Muster
Grundlegende Definitionen:
-
Angebot.a-z
entspricht Kleinbuchstaben von a bis z0-5
entspricht eine beliebige Zahl von 0 bis 5[]
Passen Sie genau eines der Objekte in diesen Klammern an.[a]
passt der Buchstabe a[abc]
entspricht ein einzelner Buchstabe, der a, b oder c sein kann[a-z]
passt zu einem einzelnen Kleinbuchstaben des Alphabets.()
Gruppiert verschiedene Übereinstimmungen für Rückgabezwecke. Siehe Beispiele unten.{}
Multiplikator für wiederholte Kopien des zuvor definierten Musters.[a]{2}
passt zwei aufeinanderfolgende Kleinbuchstaben a:aa
[a]{1,3}
entspricht mindestens einem und bis zu drei Kleinbuchstabena
,aa
,aaa
+
Passen Sie mindestens eines oder mehrere der zuvor definierten Muster an.a+
wird in Folge eine der übereinstimmena
,aa
,aaa
, und so weiter?
Passen Sie Null oder eines der zuvor definierten Muster an.[a-z]?
passt eine leere Zeichenfolge oder ein einzelner Kleinbuchstabe zusammen.*
Passen Sie null oder mehr des zuvor definierten Musters an. - ZB Platzhalter für Muster, die vorhanden sein können oder nicht. - ZB[a-z]*
entspricht eine leere Zeichenfolge oder eine Zeichenfolge aus Kleinbuchstaben..
Entspricht jedem Zeichen außer Zeilenumbruch\n
a.
Entspricht einer zweistelligen Zeichenfolge, die mit a beginnt und mit etwas anderem endet\n
|
ODER-Operatora|b
bedeutet entwedera
oderb
kann angepasst werden.red|white|orange
passt genau eine der Farben.^
NICHT Betreiber[^0-9]
Zeichen darf keine Zahl enthalten[^aA]
kann ein Zeichen nicht in Klein-a
oder Großbuchstaben geschrieben werdenA
\
Entgeht dem folgenden Sonderzeichen (überschreibt das obige Verhalten)\.
,\\
,\(
,\?
,\$
,\^
Verankerungsmuster:
^
Die Übereinstimmung muss am Anfang der Zeichenfolge erfolgen^a
erste Zeichen muss ein Kleinbuchstabe seina
^[0-9]
erste Zeichen muss eine Zahl sein.$
Die Übereinstimmung muss am Ende der Zeichenfolge erfolgena$
letzte Zeichen muss ein Kleinbuchstabe seina
Rangfolge:
Vordefinierte Zeichenabkürzungen:
Beispiel 1 : Als Makro ausführen
Das folgende Beispielmakro untersucht den Wert in der Zelle,
A1
um festzustellen, ob die ersten 1 oder 2 Zeichen Ziffern sind. In diesem Fall werden sie entfernt und der Rest der Zeichenfolge wird angezeigt. Wenn nicht, wird ein Feld angezeigt, das Sie darüber informiert, dass keine Übereinstimmung gefunden wurde. DieA1
Zellenwerte von12abc
werden zurückgegebenabc
, der Wert von1abc
wird zurückgegebenabc
, der Wert vonabc123
wird "Nicht übereinstimmend" zurückgeben, da die Ziffern nicht am Anfang der Zeichenfolge standen.Beispiel 2 : Als In-Cell-Funktion ausführen
Dieses Beispiel ist dasselbe wie in Beispiel 1, ist jedoch so eingerichtet, dass es als In-Cell-Funktion ausgeführt wird. Ändern Sie zur Verwendung den Code wie folgt:
Platziere deine Saiten ("12abc") in der Zelle
A1
. Geben Sie diese Formel=simpleCellRegex(A1)
in die Zelle einB1
und das Ergebnis ist "abc".Beispiel 3 : Durchschleifbereich
Dieses Beispiel ist dasselbe wie in Beispiel 1, durchläuft jedoch eine Reihe von Zellen.
Beispiel 4 : Aufteilen verschiedener Muster
In diesem Beispiel wird ein Bereich (
A1
,A2
&A3
) durchlaufen und nach einer Zeichenfolge gesucht, die mit drei Ziffern beginnt, gefolgt von einem einzelnen Alpha-Zeichen und vier numerischen Ziffern. Die Ausgabe teilt die Musterübereinstimmungen unter Verwendung von in benachbarte Zellen auf()
.$1
stellt das erste Muster dar, das innerhalb des ersten Satzes von übereinstimmt()
.Ergebnisse:
Zusätzliche Musterbeispiele
quelle
Set regEx = Nothing
. Sie erhalten Aus-Speicher-Ausnahmen, wenn dieses Sub häufig genug ausgeführt wird.Set regEx = CreateObject("VBScript.RegExp")
ThisWorkbook
. Versuchen Sie, den Code in einen separaten Code zu verschiebenModule
.Um reguläre Ausdrücke direkt in Excel-Formeln zu verwenden, kann die folgende UDF (benutzerdefinierte Funktion) hilfreich sein. Es macht die Funktionalität regulärer Ausdrücke mehr oder weniger direkt als Excel-Funktion verfügbar.
Wie es funktioniert
Es dauert 2-3 Parameter.
$0
,$1
,$2
, und so weiter.$0
ist die gesamte Übereinstimmung$1
und entspricht den jeweiligen Übereinstimmungsgruppen im regulären Ausdruck. Der Standardwert ist$0
.Einige Beispiele
Extrahieren einer E-Mail-Adresse:
Ergebnisse in:
[email protected]
Mehrere Teilzeichenfolgen extrahieren:
Ergebnisse in:
E-Mail: [email protected], Name: Peter Gordon
So zerlegen Sie eine kombinierte Zeichenfolge in einer einzelnen Zelle in ihre Komponenten in mehreren Zellen:
Ergebnisse in:
Peter Gordon
[email protected]
...Wie benutzt man
Um diese UDF zu verwenden, gehen Sie wie folgt vor (ungefähr basierend auf dieser Microsoft-Seite . Sie haben dort einige gute zusätzliche Informationen!):
ALT+F11
um den Microsoft Visual Basic für Anwendungseditor zu öffnen .Klicken Sie auf Modul einfügen . Wenn Sie Ihrem Modul einen anderen Namen geben, stellen Sie sicher, dass das Modul nicht denselben Namen wie die unten stehende UDF hat (z. B. die Benennung des Moduls
Regex
und der Funktionregex
verursacht #NAME! -Fehler ).Fügen Sie im großen Textfenster in der Mitte Folgendes ein:
Speichern und schließen Sie das Fenster Microsoft Visual Basic für Anwendungseditor .
quelle
Function foo() As Variant \n foo="Hello World" \n End Function
UDF zu erstellen, um zu sehen, ob dies funktioniert. Wenn ja, arbeiten Sie sich bis zum oben genannten Punkt vor, wenn nichts Grundlegendes kaputt ist (Makros deaktiviert?).Erweitern Sie die Antwort von Patszim für diejenigen, die es eilig haben.
Fügen Sie den folgenden Code hinzu:
Das Regex-Muster wird in eine der Zellen eingefügt und mit absoluter Referenzierung versehen . Die Funktion ist an die Arbeitsmappe gebunden, in der sie erstellt wurde.
Wenn sie in verschiedenen Arbeitsmappen verwendet werden muss, speichern Sie die Funktion in Personal.XLSB
quelle
Hier ist mein Versuch:
quelle
Ich musste dies als Zellfunktion (wie
SUM
oderVLOOKUP
) verwenden und fand, dass es einfach war:Erstellen Sie die folgende Funktion entweder in einer Arbeitsmappe oder in einem eigenen Modul:
Dann können Sie in Zelle mit
=REGPLACE(B1, "(\w) (\d+)", "$1$2")
(zB: "A 243" bis "A243") verwendenquelle
Dies ist keine direkte Antwort, bietet jedoch möglicherweise eine effizientere Alternative für Ihre Überlegung. Das heißt, Google Sheets verfügt über mehrere integrierte Regex-Funktionen. Diese können sehr praktisch sein und dabei helfen, einige der technischen Verfahren in Excel zu umgehen. Natürlich bietet die Verwendung von Excel auf Ihrem PC einige Vorteile, aber für die große Mehrheit der Nutzer bietet Google Sheets eine identische Erfahrung und bietet möglicherweise einige Vorteile bei der Portabilität und Freigabe von Dokumenten.
Sie bieten an
REGEXEXTRACT: Extrahiert übereinstimmende Teilzeichenfolgen gemäß einem regulären Ausdruck.
REGEXREPLACE: Ersetzt einen Teil einer Textzeichenfolge durch eine andere Textzeichenfolge mit regulären Ausdrücken.
ERSATZ: Ersetzt vorhandenen Text durch neuen Text in einer Zeichenfolge.
ERSETZEN: Ersetzt einen Teil einer Textzeichenfolge durch eine andere Textzeichenfolge.
Sie können diese direkt in eine Zelle eingeben und so produzieren, was Sie möchten
Sie funktionieren auch sehr gut in Kombination mit anderen Funktionen wie IF- Anweisungen wie folgt:
Hoffentlich bietet dies eine einfache Problemumgehung für Benutzer, die sich von der VBS-Komponente von Excel verspottet fühlen.
quelle
Hier ist eine
regex_subst()
Funktion. Beispiele:Hier ist der vereinfachte Code (für mich jedenfalls einfacher). Ich konnte mit den obigen Angaben nicht herausfinden, wie ein geeignetes Ausgabemuster erstellt werden kann, um wie in meinen Beispielen zu funktionieren:
quelle
Ich möchte keine Referenzbibliothek aktivieren müssen, da meine Skripte portabel sein müssen. Die
Dim foo As New VBScript_RegExp_55.RegExp
Leitung verursachteUser Defined Type Not Defined
Fehler, aber ich fand eine Lösung, die für mich funktionierte.Sie möchten eine Beispielzeichenfolge in die Zelle einfügen
A1
und dann Ihre testenstrPattern
. Sobald das funktioniert, stellen Sie esrng
wie gewünscht ein.quelle
VBScript_RegExp_55
Bibliothek ist nahezu allgegenwärtig und birgt daher ein sehr geringes Risiko, nicht auf einem bestimmten Zielcomputer zu sein. Der Wechsel von Early Bound zu Late Bound löst das Portabilitätsproblem nicht (der Code wird immer noch fehlerhaft sein, nur zur Laufzeit und nicht zur Kompilierungszeit)Um den wertvollen Inhalt zu ergänzen, möchte ich diese Erinnerung daran erstellen, warum RegEx in VBA manchmal nicht ideal ist. Nicht alle Ausdrücke werden unterstützt, sondern werfen möglicherweise einen
Error 5017
und lassen den Autor raten (was ich selbst ein Opfer bin).Während wir einige finden Quellen auf , was wird unterstützt, wäre es hilfreich zu wissen , welche Meta - Zeichen usw. sind nicht unterstützt. Eine ausführlichere Erklärung finden Sie hier . Erwähnt in dieser Quelle:
Also, nicht unterstützt:
\A
, verwenden Sie alternativ das^
Caret, um die Position vor dem 1. Zeichen in der Zeichenfolge abzugleichen\Z
alternativ die Verwendung$
Dollarzeichen Postion nach dem letzten Zeichen in String zu(?<=a)b
(während postive Lookahead wird unterstützt)(?<!a)b
(während negative Vorschau wird unterstützt)\{uFFFF}
/i
(Groß- / Kleinschreibung beachten) oder/g
(global) usw. Legen Sie diese über dieRegExp
Objekteigenschaften>RegExp.Global = True
undRegExp.IgnoreCase = True
falls verfügbar fest.'
Kommentaren im Skript hinzuIch bin bereits mehr als einmal mit regulären Ausdrücken in VBA gegen eine Wand gestoßen. Normalerweise mit,
LookBehind
aber manchmal vergesse ich sogar die Modifikatoren. Ich habe all diese oben genannten Hintergründe nicht selbst erlebt, dachte aber, ich würde versuchen, mich auf einige detailliertere Informationen zu beziehen. Fühlen Sie sich frei zu kommentieren / korrigieren / hinzufügen. Ein großes Dankeschön an reguläre-Ausdrücke.info für eine Fülle von Informationen.PS Sie haben reguläre VBA-Methoden und -Funktionen erwähnt, und ich kann bestätigen, dass sie (zumindest für mich selbst) auf ihre eigene Weise hilfreich waren, wenn RegEx fehlschlagen würde.
quelle