Verwendung von regulären Ausdrücken (Regex) in Microsoft Excel sowohl in Zellen als auch in Schleifen

592

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, InstrTyp Befehle für ähnliche Manipulationen.

Portland Runner
quelle
11
Ich empfehle diesen VB / VBA Regexp Artikel von Patrick Matthews
brettdj
1
Probieren Sie dieses kostenlose Add-In aus: seotoolsforexcel.com/regexpfind
Niels Bosma
1
Vergessen wir nicht den 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.
Egalth

Antworten:

955

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.

  • Wählen Sie die Registerkarte "Entwickler" ( Ich habe diese Registerkarte nicht, was mache ich? )
  • Wählen Sie das Symbol "Visual Basic" aus dem Abschnitt "Code"
  • Wählen Sie im Fenster "Microsoft Visual Basic für Applikationen" im oberen Menü "Extras".
  • Wählen Sie "Referenzen"
  • Aktivieren Sie das Kontrollkästchen neben "Microsoft VBScript Regular Expressions 5.5", um es in Ihre Arbeitsmappe aufzunehmen.
  • OK klicken"

Schritt 2 : Definieren Sie Ihr Muster

Grundlegende Definitionen:

- Angebot.

  • ZB a-zentspricht Kleinbuchstaben von a bis z
  • ZB 0-5entspricht eine beliebige Zahl von 0 bis 5

[] Passen Sie genau eines der Objekte in diesen Klammern an.

  • ZB [a]passt der Buchstabe a
  • ZB [abc]entspricht ein einzelner Buchstabe, der a, b oder c sein kann
  • ZB [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.

  • ZB [a]{2}passt zwei aufeinanderfolgende Kleinbuchstaben a:aa
  • Zum Beispiel [a]{1,3}entspricht mindestens einem und bis zu drei Kleinbuchstaben a, aa,aaa

+ Passen Sie mindestens eines oder mehrere der zuvor definierten Muster an.

  • Zum Beispiel a+wird in Folge eine der übereinstimmen a, aa, aaa, und so weiter

? Passen Sie Null oder eines der zuvor definierten Muster an.

  • ZB kann ein Muster vorhanden sein oder nicht, es kann jedoch nur einmal abgeglichen werden.
  • ZB [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

  • ZB a.Entspricht einer zweistelligen Zeichenfolge, die mit a beginnt und mit etwas anderem endet\n

| ODER-Operator

  • ZB a|bbedeutet entweder aoder bkann angepasst werden.
  • ZB red|white|orangepasst genau eine der Farben.

^ NICHT Betreiber

  • ZB [^0-9]Zeichen darf keine Zahl enthalten
  • ZB [^aA]kann ein Zeichen nicht in Klein- aoder Großbuchstaben geschrieben werdenA

\ Entgeht dem folgenden Sonderzeichen (überschreibt das obige Verhalten)

  • Zum Beispiel \., \\, \(, \?, \$,\^

Verankerungsmuster:

^ Die Übereinstimmung muss am Anfang der Zeichenfolge erfolgen

  • ZB Das ^aerste Zeichen muss ein Kleinbuchstabe seina
  • ZB Das ^[0-9]erste Zeichen muss eine Zahl sein.

$ Die Übereinstimmung muss am Ende der Zeichenfolge erfolgen

  • ZB Das a$letzte Zeichen muss ein Kleinbuchstabe seina

Rangfolge:

Order  Name                Representation
1      Parentheses         ( )
2      Multipliers         ? + * {m,n} {m, n}?
3      Sequence & Anchors  abc ^ $
4      Alternation         |

Vordefinierte Zeichenabkürzungen:

abr    same as       meaning
\d     [0-9]         Any single digit
\D     [^0-9]        Any single character that's not a digit
\w     [a-zA-Z0-9_]  Any word character
\W     [^a-zA-Z0-9_] Any non-word character
\s     [ \r\t\n\f]   Any space character
\S     [^ \r\t\n\f]  Any non-space character
\n     [\n]          New line

Beispiel 1 : Als Makro ausführen

Das folgende Beispielmakro untersucht den Wert in der Zelle, A1um 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. Die A1Zellenwerte von 12abcwerden zurückgegeben abc, der Wert von 1abcwird zurückgegeben abc, der Wert von abc123wird "Nicht übereinstimmend" zurückgeben, da die Ziffern nicht am Anfang der Zeichenfolge standen.

Private Sub simpleRegex()
    Dim strPattern As String: strPattern = "^[0-9]{1,2}"
    Dim strReplace As String: strReplace = ""
    Dim regEx As New RegExp
    Dim strInput As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("A1")

    If strPattern <> "" Then
        strInput = Myrange.Value

        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = strPattern
        End With

        If regEx.Test(strInput) Then
            MsgBox (regEx.Replace(strInput, strReplace))
        Else
            MsgBox ("Not matched")
        End If
    End If
End Sub

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:

Function simpleCellRegex(Myrange As Range) As String
    Dim regEx As New RegExp
    Dim strPattern As String
    Dim strInput As String
    Dim strReplace As String
    Dim strOutput As String


    strPattern = "^[0-9]{1,3}"

    If strPattern <> "" Then
        strInput = Myrange.Value
        strReplace = ""

        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = strPattern
        End With

        If regEx.test(strInput) Then
            simpleCellRegex = regEx.Replace(strInput, strReplace)
        Else
            simpleCellRegex = "Not matched"
        End If
    End If
End Function

Platziere deine Saiten ("12abc") in der Zelle A1. Geben Sie diese Formel =simpleCellRegex(A1)in die Zelle ein B1und das Ergebnis ist "abc".

Ergebnisbild


Beispiel 3 : Durchschleifbereich

Dieses Beispiel ist dasselbe wie in Beispiel 1, durchläuft jedoch eine Reihe von Zellen.

Private Sub simpleRegex()
    Dim strPattern As String: strPattern = "^[0-9]{1,2}"
    Dim strReplace As String: strReplace = ""
    Dim regEx As New RegExp
    Dim strInput As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("A1:A5")

    For Each cell In Myrange
        If strPattern <> "" Then
            strInput = cell.Value

            With regEx
                .Global = True
                .MultiLine = True
                .IgnoreCase = False
                .Pattern = strPattern
            End With

            If regEx.Test(strInput) Then
                MsgBox (regEx.Replace(strInput, strReplace))
            Else
                MsgBox ("Not matched")
            End If
        End If
    Next
End Sub

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 (). $1stellt das erste Muster dar, das innerhalb des ersten Satzes von übereinstimmt ().

Private Sub splitUpRegexPattern()
    Dim regEx As New RegExp
    Dim strPattern As String
    Dim strInput As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("A1:A3")

    For Each C In Myrange
        strPattern = "(^[0-9]{3})([a-zA-Z])([0-9]{4})"

        If strPattern <> "" Then
            strInput = C.Value

            With regEx
                .Global = True
                .MultiLine = True
                .IgnoreCase = False
                .Pattern = strPattern
            End With

            If regEx.test(strInput) Then
                C.Offset(0, 1) = regEx.Replace(strInput, "$1")
                C.Offset(0, 2) = regEx.Replace(strInput, "$2")
                C.Offset(0, 3) = regEx.Replace(strInput, "$3")
            Else
                C.Offset(0, 1) = "(Not matched)"
            End If
        End If
    Next
End Sub

Ergebnisse:

Ergebnisbild


Zusätzliche Musterbeispiele

String   Regex Pattern                  Explanation
a1aaa    [a-zA-Z][0-9][a-zA-Z]{3}       Single alpha, single digit, three alpha characters
a1aaa    [a-zA-Z]?[0-9][a-zA-Z]{3}      May or may not have preceding alpha character
a1aaa    [a-zA-Z][0-9][a-zA-Z]{0,3}     Single alpha, single digit, 0 to 3 alpha characters
a1aaa    [a-zA-Z][0-9][a-zA-Z]*         Single alpha, single digit, followed by any number of alpha characters

</i8>    \<\/[a-zA-Z][0-9]\>            Exact non-word character except any single alpha followed by any single digit
Portland Runner
quelle
22
Das solltest du nicht vergessen Set regEx = Nothing. Sie erhalten Aus-Speicher-Ausnahmen, wenn dieses Sub häufig genug ausgeführt wird.
Kiril
1
Ich habe Beispiel 4 mit SubMatches für die Behandlung komplexerer Regex angepasst. Grundsätzlich verwende ich beim Teilen kein Ersetzen, wenn jemand interessiert ist: stackoverflow.com/questions/30218413/…
Armfoot
11
Späte Bindungslinie:Set regEx = CreateObject("VBScript.RegExp")
ZygD
2
Okay, ich bin mir ziemlich sicher, dass der Code drin ist ThisWorkbook. Versuchen Sie, den Code in einen separaten Code zu verschieben Module.
Portland Runner
3
@PortlandRunner im "Projektexplorer" (?) Dieser Excel-Datei fehlte ein Unterordner "Module", obwohl in einer anderen Datei einer angezeigt wurde. Klicken Sie mit der rechten Maustaste auf die Datei und wählen Sie "Modul einfügen". Doppelklicken Sie dann auf "Modul 1" und fügen Sie den Code ein. Gerettet. Zurück zur Arbeitsmappe und die Funktion erneut eingeben - es hat funktioniert. Könnte die Antwort für die Unerfahrenen wie mich bemerkenswert sein? Danke für die Hilfe.
youcantryreachingme
205

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.

  1. Ein Text, für den der reguläre Ausdruck verwendet werden soll.
  2. Ein regulärer Ausdruck.
  3. Eine Formatzeichenfolge, die angibt, wie das Ergebnis aussehen soll. Es kann enthalten $0, $1, $2, und so weiter. $0ist die gesamte Übereinstimmung $1und entspricht den jeweiligen Übereinstimmungsgruppen im regulären Ausdruck. Der Standardwert ist $0.

Einige Beispiele

Extrahieren einer E-Mail-Adresse:

=regex("Peter Gordon: [email protected], 47", "\w+@\w+\.\w+")
=regex("Peter Gordon: [email protected], 47", "\w+@\w+\.\w+", "$0")

Ergebnisse in: [email protected]

Mehrere Teilzeichenfolgen extrahieren:

=regex("Peter Gordon: [email protected], 47", "^(.+): (.+), (\d+)$", "E-Mail: $2, Name: $1")

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:

=regex("Peter Gordon: [email protected], 47", "^(.+): (.+), (\d+)$", "$" & 1)
=regex("Peter Gordon: [email protected], 47", "^(.+): (.+), (\d+)$", "$" & 2)

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!):

  1. Drücken Sie in Excel in einer makrofähigen Datei ('.xlsm'), ALT+F11um den Microsoft Visual Basic für Anwendungseditor zu öffnen .
  2. Fügen Sie der Regular Expressions-Bibliothek einen VBA-Verweis hinzu (schamlos kopiert aus der Antwort von Portland Runners ++ ):
    1. Klicken Sie auf Extras -> Referenzen (bitte entschuldigen Sie den deutschen Screenshot) Werkzeuge -> Referenzen
    2. Suchen Sie in der Liste nach Microsoft VBScript Regular Expressions 5.5 und aktivieren Sie das Kontrollkästchen daneben.
    3. Klicken Sie auf OK .
  3. 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 Regexund der Funktion regexverursacht #NAME! -Fehler ).

    Zweites Symbol in der Symbolzeile -> Modul

  4. Fügen Sie im großen Textfenster in der Mitte Folgendes ein:

    Function regex(strInput As String, matchPattern As String, Optional ByVal outputPattern As String = "$0") As Variant
        Dim inputRegexObj As New VBScript_RegExp_55.RegExp, outputRegexObj As New VBScript_RegExp_55.RegExp, outReplaceRegexObj As New VBScript_RegExp_55.RegExp
        Dim inputMatches As Object, replaceMatches As Object, replaceMatch As Object
        Dim replaceNumber As Integer
    
        With inputRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = matchPattern
        End With
        With outputRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = "\$(\d+)"
        End With
        With outReplaceRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
        End With
    
        Set inputMatches = inputRegexObj.Execute(strInput)
        If inputMatches.Count = 0 Then
            regex = False
        Else
            Set replaceMatches = outputRegexObj.Execute(outputPattern)
            For Each replaceMatch In replaceMatches
                replaceNumber = replaceMatch.SubMatches(0)
                outReplaceRegexObj.Pattern = "\$" & replaceNumber
    
                If replaceNumber = 0 Then
                    outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).Value)
                Else
                    If replaceNumber > inputMatches(0).SubMatches.Count Then
                        'regex = "A to high $ tag found. Largest allowed is $" & inputMatches(0).SubMatches.Count & "."
                        regex = CVErr(xlErrValue)
                        Exit Function
                    Else
                        outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).SubMatches(replaceNumber - 1))
                    End If
                End If
            Next
            regex = outputPattern
        End If
    End Function
  5. Speichern und schließen Sie das Fenster Microsoft Visual Basic für Anwendungseditor .

Patrick Böker
quelle
6
Diese Antwort mit den Schritten kombiniert hier ein Add-In zu erstellen, ist sehr hilfreich. Vielen Dank. Stellen Sie sicher, dass Sie Ihrem Modul und Ihrer Funktion nicht den gleichen Namen geben!
Chris Hunt
2
Ich wiederhole nur den obigen Kommentar von Chris Hunt. Nennen Sie Ihr Modul nicht auch "Regex". Ich dachte, ich würde eine Weile verrückt werden, da die Funktion aufgrund eines # NAME-Fehlers nicht funktionieren würde
Chris
Nun, ich bin verrückt geworden, als ich alles ausprobiert habe (einschließlich des Änderns von Modulen / Namen) und immer noch den Fehler #NAME> _> i.imgur.com/UUQ6eCi.png
Enissay,
@Enissay: Versuchen Sie, eine minimale Function foo() As Variant \n foo="Hello World" \n End FunctionUDF 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?).
Patrick Böker
1
@ Vijay: Gleiches unter github.com/malcolmp/excel-regular-expressions
Vadim
64

Erweitern Sie die Antwort von Patszim für diejenigen, die es eilig haben.

  1. Öffnen Sie die Excel-Arbeitsmappe.
  2. Alt+ F11, um das VBA / Makros-Fenster zu öffnen.
  3. Fügen Sie unter Extras und dann unter Verweise einen Verweis auf Regex hinzu
    ! [Excel VBA Form Referenzen hinzufügen
  4. und Auswählen von Microsoft VBScript Regular Expression 5.5
    ! [Excel VBA Regex-Referenz hinzufügen
  5. Fügen Sie ein neues Modul ein (Code muss sich im Modul befinden, sonst funktioniert es nicht).
    ! [Excel VBA-Code zum Einfügen von Code
  6. Im neu eingefügten Modul
    ! [Excel VBA Code in Modul einfügen
  7. Fügen Sie den folgenden Code hinzu:

    Function RegxFunc(strInput As String, regexPattern As String) As String
        Dim regEx As New RegExp
        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .pattern = regexPattern
        End With
    
        If regEx.Test(strInput) Then
            Set matches = regEx.Execute(strInput)
            RegxFunc = matches(0).Value
        Else
            RegxFunc = "not matched"
        End If
    End Function
  8. Das Regex-Muster wird in eine der Zellen eingefügt und mit absoluter Referenzierung versehen . ! [Excel-Regex-Funktion in der Zelle 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

Sam
quelle
1
Vielen Dank, dass Sie erwähnt haben, dass es in Personal.xlsb enthalten sein muss, damit es in allen Excel-Dokumenten verfügbar ist, an denen Sie arbeiten. Die meisten (?) Anderen Antworten machen das nicht klar. Personal.XLSB würde in den Ordner gehen (möglicherweise muss der Ordner erstellt werden) C: \ Benutzer \ Benutzername \ AppData \ Local \ Microsoft \ Excel \ XLStart-Ordner
Mark Stewart
26

Hier ist mein Versuch:

Function RegParse(ByVal pattern As String, ByVal html As String)
    Dim regex   As RegExp
    Set regex = New RegExp

    With regex
        .IgnoreCase = True  'ignoring cases while regex engine performs the search.
        .pattern = pattern  'declaring regex pattern.
        .Global = False     'restricting regex to find only first match.

        If .Test(html) Then         'Testing if the pattern matches or not
            mStr = .Execute(html)(0)        '.Execute(html)(0) will provide the String which matches with Regex
            RegParse = .Replace(mStr, "$1") '.Replace function will replace the String with whatever is in the first set of braces - $1.
        Else
            RegParse = "#N/A"
        End If

    End With
End Function
Vikas Gautam
quelle
9

Ich musste dies als Zellfunktion (wie SUModer VLOOKUP) verwenden und fand, dass es einfach war:

  1. Stellen Sie sicher, dass Sie sich in einer makrofähigen Excel-Datei befinden (als xlsm speichern).
  2. Öffnen Sie die Entwicklertools Alt+F11
  3. Fügen Sie Microsoft VBScript Regular Expressions 5.5 wie in anderen Antworten hinzu
  4. Erstellen Sie die folgende Funktion entweder in einer Arbeitsmappe oder in einem eigenen Modul:

    Function REGPLACE(myRange As Range, matchPattern As String, outputPattern As String) As Variant
        Dim regex As New VBScript_RegExp_55.RegExp
        Dim strInput As String
    
        strInput = myRange.Value
    
        With regex
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = matchPattern
        End With
    
        REGPLACE = regex.Replace(strInput, outputPattern)
    
    End Function
  5. Dann können Sie in Zelle mit =REGPLACE(B1, "(\w) (\d+)", "$1$2")(zB: "A 243" bis "A243") verwenden

DeezCashews
quelle
Diese Benennung von outputPattern hat mich umgehauen. Es ist der Wiederbeschaffungswert.
Thor
1
Ja. Ich nehme an, ich habe es mit dem Namen pattern belassen, damit klar war, dass es nicht nur eine Zeichenfolgenersetzung war und Sie Regex-Matching-Gruppen wie $ 1 $ 2 usw. verwenden konnten.
DeezCashews
7

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

=REGEXMATCH(A2, "[0-9]+")

Sie funktionieren auch sehr gut in Kombination mit anderen Funktionen wie IF- Anweisungen wie folgt:

=IF(REGEXMATCH(E8,"MiB"),REGEXEXTRACT(E8,"\d*\.\d*|\d*")/1000,IF(REGEXMATCH(E8,"GiB"),REGEXEXTRACT(E8,"\d*\.\d*|\d*"),"")

Geben Sie hier die Bildbeschreibung ein

Hoffentlich bietet dies eine einfache Problemumgehung für Benutzer, die sich von der VBS-Komponente von Excel verspottet fühlen.

Alex Roseland
quelle
Danke, dass du Alex geteilt hast. Dies ist nützlich für diejenigen, die nach einer Google-Version suchen. Sie können eine andere Frage speziell für Google Sheets Regex schreiben und beantworten, da diese eine eigene Nomenklatur hat und für andere sehr nützlich wäre. Egal, du hast meine Gegenstimme!
Portland Runner
4

Hier ist eine regex_subst()Funktion. Beispiele:

=regex_subst("watermellon", "[aeiou]", "")
---> wtrmlln
=regex_subst("watermellon", "[^aeiou]", "")
---> aeeo

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:

Function regex_subst( _
     strInput As String _
   , matchPattern As String _
   , Optional ByVal replacePattern As String = "" _
) As Variant
    Dim inputRegexObj As New VBScript_RegExp_55.RegExp

    With inputRegexObj
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        .Pattern = matchPattern
    End With

    regex_subst = inputRegexObj.Replace(strInput, replacePattern)
End Function
jgreve
quelle
1

Ich möchte keine Referenzbibliothek aktivieren müssen, da meine Skripte portabel sein müssen. Die Dim foo As New VBScript_RegExp_55.RegExpLeitung verursachte User Defined Type Not DefinedFehler, aber ich fand eine Lösung, die für mich funktionierte.

Sie möchten eine Beispielzeichenfolge in die Zelle einfügen A1und dann Ihre testen strPattern. Sobald das funktioniert, stellen Sie es rngwie gewünscht ein.

Public Sub RegExSearch()
'/programming/22542834/how-to-use-regular-expressions-regex-in-microsoft-excel-both-in-cell-and-loops
'https://wellsr.com/vba/2018/excel/vba-regex-regular-expressions-guide/
'https://www.vitoshacademy.com/vba-regex-in-excel/
    Dim regexp As Object
    'Dim regex As New VBScript_RegExp_55.regexp 'Caused "User Defined Type Not Defined" Error
    Dim rng As Range, rcell As Range
    Dim strInput As String, strPattern As String

    Set regexp = CreateObject("vbscript.regexp")
    Set rng = ActiveSheet.Range("A1:A1")

    strPattern = "([a-z]{2})([0-9]{8})"
    'Search for 2 Letters then 8 Digits Eg: XY12345678 = Matched

    With regexp
        .Global = False
        .MultiLine = False
        .ignoreCase = True
        .Pattern = strPattern
    End With

    For Each rcell In rng.Cells

        If strPattern <> "" Then
            strInput = rcell.Value

            If regexp.test(strInput) Then
                MsgBox rcell & " Matched in Cell " & rcell.Address
            Else
                MsgBox "No Matches!"
            End If
        End If
    Next
End Sub
FreeSoftwareServer
quelle
Ich möchte keine Referenzbibliothek aktivieren müssen, da meine Skripte portabel sein müssen. Die VBScript_RegExp_55Bibliothek 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)
chris neilsen
1
Nein, das stimmt überhaupt nicht. Dieses Skript kann mit einem anderen Benutzer geteilt werden, ohne dass dieser etwas Portables aktiviert. Vielen Dank an
FreeSoftwareServers
1
Sicher, aber der RegEx - Code wird nicht verwendbar . Wenn das RegEx-Zeug Teil einer größeren Bibliotheksarbeitsmappe ist, kann es als nützlich erachtet werden, wenn kein Kompilierungsfehler
auftritt.
1

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 5017und 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:

"Obwohl" VBScript's regulärer Ausdruck ... Version 5.5 implementiert einige wesentliche Regex-Funktionen, die in früheren Versionen von VBScript fehlten. ... JavaScript und VBScript implementieren reguläre Ausdrücke im Perl-Stil. Es fehlen ihnen jedoch eine Reihe fortschrittlicher Funktionen, die in Perl und anderen modernen Geschmacksrichtungen für reguläre Ausdrücke verfügbar sind: "


Also, nicht unterstützt:

  • Beginn von String ancor \A, verwenden Sie alternativ das ^Caret, um die Position vor dem 1. Zeichen in der Zeichenfolge abzugleichen
  • End of String ancor \Zalternativ die Verwendung $Dollarzeichen Postion nach dem letzten Zeichen in String zu
  • Positive Lookbehind, zum Beispiel: (?<=a)b(während postive Lookahead wird unterstützt)
  • Negative Lookbehind, zum Beispiel: (?<!a)b(während negative Vorschau wird unterstützt)
  • Atomare Gruppierung
  • Possessive Quantifizierer
  • Unicode zB: \{uFFFF}
  • Benannte Erfassungsgruppen . Alternativ können Sie auch nummerierte Erfassungsgruppen verwenden
  • Inline-Modifikatoren, z. B.: /i(Groß- / Kleinschreibung beachten) oder /g(global) usw. Legen Sie diese über die RegExpObjekteigenschaften> RegExp.Global = Trueund RegExp.IgnoreCase = Truefalls verfügbar fest.
  • Bedingungen
  • Kommentare zu regulären Ausdrücken . Fügen Sie diese mit regelmäßigen 'Kommentaren im Skript hinzu

Ich bin bereits mehr als einmal mit regulären Ausdrücken in VBA gegen eine Wand gestoßen. Normalerweise mit, LookBehindaber 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.

JvdV
quelle