RegExMatch() [v1.0.45+]

Überprüft, ob ein Suchmuster (regulärer Ausdruck) in einer Zeichenkette vorkommt.

FundPos := RegExMatch(Heuhaufen, NadelRegEx , AusgabeVar, StartPos := 1)

Parameter

Heuhaufen

Eine Zeichenkette, deren Inhalt durchsucht werden soll.

NadelRegEx

Ein Suchmuster im PCRE-Format (Perl-kompatibler regulärer Ausdruck). Die Optionen des Suchmusters (falls vorhanden) müssen am Anfang der Zeichenkette stehen, gefolgt von dem Zeichen ")". Das Suchmuster i)abc.*123 beispielsweise deaktiviert die Groß-/Kleinschreibung-Sensitivität und sucht nach einer Zeichenkette, die sich zusammensetzt aus "abc", null oder mehr Vorkommen eines beliebigen Zeichens und "123". Wenn keine Optionen vorhanden sind, ist das Zeichen ")" optional; zum Beispiel ist )abc das gleiche wie abc.

AusgabeVar

Modus 1 (Standard): Geben Sie ein Variable an, in der der Teil von Heuhaufen gespeichert werden soll, der dem gesamten Suchmuster entsprach. Wenn das Suchmuster nicht gefunden wird (also wenn die Funktion 0 zurückgibt), werden diese Variable und alle Array-Elemente (siehe unten) leer gemacht.

Sind erfassende Teilsuchmuster innerhalb von NadelRegEx vorhanden, werden ihre Übereinstimmungen in ein Pseudo-Array mit dem Basisnamen AusgabeVar gespeichert. Wenn der Name der Variable beispielsweise Match lautet, wird die gefundene Teilzeichenkette des ersten Teilsuchmusters in Match1 gespeichert, die zweite in Match2 und so weiter. Eine Ausnahme hiervon sind benannte Teilsuchmuster - sie werden nicht via Nummer, sondern via Name gespeichert. Zum Beispiel würde eine Teilzeichenkette, die dem benannten Teilsuchmuster (?P<Jahr>\d{4}) entspricht, in MatchJahr gespeichert werden. Wenn für ein bestimmtes Teilsuchmuster keine Übereinstimmung gefunden wird (oder die Funktion 0 zurückgibt), wird die entsprechende Variable leer gemacht.

Um innerhalb einer Funktion ein globales statt lokales Pseudo-Array zu erstellen, muss der Basisname des Pseudo-Arrays (z. B. Match) vor seiner Verwendung als globale Variable deklariert werden. Umgekehrt gilt das Gleiche bei Assume-Global-Funktionen. Oft ist es auch notwendig, jedes Element dieses Pseudo-Arrays einzeln zu deklarieren, da ein häufiger Anlass zu Verwirrung vorliegt.

Modus 2 (Position und Länge): Wenn ein großes P in den RegEx-Optionen vorhanden ist - z. B. P)abc.*123 - wird die Länge der Übereinstimmung des gesamten Suchmusters in AusgabeVar gespeichert (oder 0, wenn keine Übereinstimmung gefunden wurde). Sind erfassende Teilsuchmuster vorhanden, werden ihre Positionen und Längen in zwei Pseudo-Arrays gespeichert: AusgabeVarPos und AusgabeVarLen. Wenn der Basisname der Variable beispielsweise Match lautet, wird die Position (beginnend bei 1) der Übereinstimmung des ersten Teilsuchmusters in MatchPos1 und ihre Länge in MatchLen1 gespeichert (in beiden wird 0 gespeichert, wenn für das Teilsuchmuster keine Übereinstimmung gefunden wurde oder die Funktion 0 zurückgibt). Eine Ausnahme hiervon sind benannte Teilsuchmuster - sie werden nicht via Nummer, sondern via Name gespeichert (z. B. MatchPosJahr und MatchLenJahr).

Modus 3 (Match-Objekt) [v1.1.05+]: Wenn ein großes O in den RegEx-Optionen vorhanden ist - z. B. O)abc.*123 - wird ein Match-Objekt in AusgabeVar gespeichert. Mit diesem Objekt kann die Position, die Länge und der Wert der gesamten Übereinstimmung sowie von jedem erfassten Teilsuchmuster abgerufen werden, sofern vorhanden.

StartPos

Lässt man StartPos weg, wird standardmäßig 1 verwendet (der Anfang von Heuhaufen). Ansonsten kann eine 2 angegeben werden, um beim zweiten Zeichen zu beginnen, eine 3, um beim dritten Zeichen zu beginnen, und so weiter. Wenn StartPos die Länge der Heuhaufen-Zeichenkette überschreitet, beginnt die Suche bei der leeren Zeichenkette am Ende der Heuhaufen-Zeichenkette (was in der Regel zu keiner Übereinstimmung führt).

Wenn StartPos kleiner als 1 ist, wird der angegebene Wert als Offset vom Ende von Heuhaufen angesehen. Zum Beispiel kann eine 0 angegeben werden, um beim letzten Zeichen zu beginnen, -1, um beim vorletzten Zeichen zu beginnen, und so weiter. Wenn StartPos versucht, über das linke Ende von Heuhaufen hinauszugehen, wird die gesamte Heuhaufen-Zeichenkette durchsucht.

Egal welchen Wert man als StartPos verwendet - der Rückgabewert ist immer relativ zum ersten Heuhaufen-Zeichen. Zum Beispiel ist die Position von "abc" in "123abc789" immer 4.

Rückgabewert

Diese Funktion gibt die Position des ersten NadelRegEx-Vorkommens ganz links in der Heuhaufen-Zeichenkette zurück. Position 1 ist das erste Zeichen. 0 wird zurückgegeben, wenn das Suchmuster nicht gefunden wurde. Falls ein Fehler auftritt (z. B. ein Syntaxfehler innerhalb von NadelRegEx), wird eine leere Zeichenkette zurückgegeben und ErrorLevel auf einen der unten genannten Werte außer 0 gesetzt.

Fehlerbehandlung

[v1.1.04+]: Diese Funktion ist in der Lage, bei Misserfolg eine Ausnahme auszulösen (nicht zu verwechseln mit "keine Übereinstimmung gefunden"). Weitere Informationen finden Sie unter Laufzeitfehler.

ErrorLevel wird auf einen der folgenden Werte gesetzt:

Optionen

Unter Optionen finden Sie Modifikatoren wie z. B. i)abc, was die Groß-/Kleinschreibung-Sensitivität im Suchmuster "abc" ausschaltet.

Match-Objekt [v1.1.05+]

Wenn ein großes O in den RegEx-Optionen vorhanden ist, wird ein Match-Objekt in AusgabeVar gespeichert. Dieses Objekt hat die folgenden Methoden und Eigenschaften:

Match.Pos(N): Gibt die Position der gesamten Übereinstimmung oder eines erfassten Teilsuchmusters zurück.

Match.Len(N): Gibt die Länge der gesamten Übereinstimmung oder eines erfassten Teilsuchmusters zurück.

Match.Value(N): Gibt die gesamte Übereinstimmung oder ein erfasstes Teilsuchmuster zurück.

Match.Name(N): Gibt den Namen eines Teilsuchmusters zurück, sofern es einen hat.

Match.Count(): Gibt die Anzahl aller Teilsuchmuster zurück.

Match.Mark(): Gibt den NAMEN des zuletzt gefundenen (*MARK:NAMEN) zurück, sofern zutreffend.

Match[N]: Wenn N eine 0 oder Nummer/Name eines gültigen Teilsuchmusters ist, dann ist dies das gleiche wie Match.Value(N). Ansonsten kann N der Name von einer der oben genannten Methoden sein. Zum Beispiel sind Match["Pos"] und Match.Pos äquivalent zu Match.Pos(), es sei denn, es existiert ein Teilsuchmuster namens "Pos", dann sind sie äquivalent zu Match.Value("Pos").

Match.N: Das gleiche wie oben, außer dass N ein Name oder eine Zahl ist, ohne Anführungszeichen.

Bei allen oben genannten Methoden und Eigenschaften kann N einer der folgenden Werte sein:

Es können eckige anstelle von runden Klammern verwendet werden, wenn N angegeben wurde.

Leistung

Um eine einfache Teilzeichenkette innerhalb einer größeren Zeichenkette zu suchen, verwenden Sie InStr(), weil es schneller als RegExMatch() ist.

Zur Verbesserung der Leistung werden die 100 zuletzt verwendeten regulären Ausdrücke zwischengespeichert (in kompilierter Form).

Die S-Option kann in bestimmten Fällen die Leistung eines häufig verwendeten regulären Ausdrucks verbessern (z. B. in einer Schleife).

Bemerkungen

Sie können einem Teilsuchmuster einen Namen geben, wie z. B. das Wort Jahr im Suchmuster (?P<Jahr>\d{4}). Solche Namen können maximal aus 32 alphanumerischen Zeichen und Unterstriche bestehen. Die folgende Einschränkung gilt nicht für den O-Modus (Match-Objekt): Obwohl benannte Teilsuchmuster während der RegEx-Operation selbst auch via Nummer zugänglich sind (z. B. ist \1 eine Rückreferenz auf die gefundene Zeichenkette des ersten erfassenden Teilsuchmusters), werden sie im Ausgabe-Pseudo-Array nur via Name gespeichert (nicht via Nummer). Wenn das erste Teilsuchmuster zum Beispiel "Jahr" heißt, wird AusgabeVarJahr auf die gefundene Teilzeichenkette gesetzt, aber AusgabeVar1 überhaupt nicht geändert (der vorherige Wert bleibt erhalten, sofern vorhanden). Wenn aber nach "Jahr" ein namenloses Teilsuchmuster erfolgt, wird dessen Fund in AusgabeVar2 gespeichert, nicht in AusgabeVar1.

Die meisten Zeichen wie abc123 haben keine spezielle Funktion und können normal in einem regulären Ausdruck verwendet werden. Die Zeichen \.*?+[{|()^$ hingegen haben eine spezielle Funktion und müssen demzufolge mit einem umgekehrten Schrägstrich versehen werden, wenn ihre Funktion außer Kraft gesetzt werden soll. Zum Beispiel wird \. als normaler Punkt und \\ als normaler umgekehrter Schrägstrich interpretiert. Um nicht nur ein Zeichen, sondern eine ganze Reihe von Zeichen als normale Zeichen zu behandeln, verwenden Sie \Q...\E. Zum Beispiel: \QNormaler Text\E.

Innerhalb eines regulären Ausdrucks können zum Escapen von Sonderzeichen wie Tabulator und Zeilenumbruch sowohl ein umgekehrtes Häkchen (`) als auch ein umgekehrter Schrägstrich (\) verwendet werden. Zum Beispiel ist `t das gleiche wie \t, es sei denn, die x-Option wird verwendet.

Grundlagen zum Thema "Reguläre Ausdrücke" finden Sie unter RegEx-Kurzübersicht.

Die regulären Ausdrücke von AutoHotkey basieren auf Perl-compatible Regular Expressions (PCRE); weitere Informationen finden Sie unter www.pcre.org.

[AHK_L 31+]: Innerhalb eines Ausdrucks kann a ~= b als Kurzschreibweise für RegExMatch(a, b) verwendet werden.

RegExReplace(), RegEx-Kurzübersicht, Callouts in regulären Ausdrücken, InStr(), IfInString, StringGetPos, SubStr(), SetTitleMatchMode RegEx, Global matching and Grep (Forum-Link)

Häufige Quellen von Textdaten: FileRead, UrlDownloadToFile, Clipboard, GUI-Eingabefelder

Beispiele

Allgemeine RegEx-Beispiele finden Sie unter RegEx-Kurzübersicht.

Meldet 4, weil das die Position ist, auf der die Übereinstimmung gefunden wurde.

MsgBox % RegExMatch("xxxabc123xyz", "abc.*xyz")

Meldet 7, weil durch $ die Übereinstimmung am Ende vorkommen muss.

MsgBox % RegExMatch("abc123123", "123$")

Meldet 1, weil eine Übereinstimmung aufgrund der nicht-Groß-/Kleinschreibung-sensitiven Option möglich gemacht wurde.

MsgBox % RegExMatch("abc123", "i)^ABC")

Meldet 1 und speichert "XYZ" in TeilMust1.

MsgBox % RegExMatch("abcXYZ123", "abc(.*)123", TeilMust)

Meldet 7 statt 1 aufgrund der Startposition 2 statt 1.

MsgBox % RegExMatch("abc123abc456", "abc\d+",, 2)

Demonstriert die Verwendung des Match-Objekts.

FundPos := RegExMatch("Musterstraße 1", "O)(.*) (?<nr>\d+)", TeilMust)  ; Das "O)" am Anfang macht TeilMust zu einem Objekt.
Msgbox % TeilMust.Count() ": " TeilMust.Value(1) " " TeilMust.Name(2) "=" TeilMust["nr"]  ; Zeigt "2: Musterstraße nr=1"

Ermittelt die Endung einer Datei. Beachten Sie, dass SplitPath auch dafür verwendet werden kann, aber mit höherer Zuverlässigkeit.

Pfad := "C:\Foo\Bar\Baz.txt"
RegExMatch(Pfad, "\w+$", Endung)
MsgBox % Endung  ; Meldet "txt".

Ähnlich wie Transform Deref erweitert die folgende Funktion Variablenreferenzen und Escapesequenzen, die sich in anderen Variablen befinden. Außerdem zeigt dieses Beispiel, wie man alle Übereinstimmungen in einer Zeichenkette findet, anstatt beim ersten Treffer anzuhalten (ähnlich wie das g-Flag in JavaScripts RegEx).

var1 := "abc"
var2 := 123
MsgBox % Deref("%var1%def%var2%")  ; Meldet abcdef123.

Deref(String)
{
    spo := 1
    out := ""
    while (fpo:=RegexMatch(String, "(%(.*?)%)|``(.)", m, spo))
    {
        out .= SubStr(String, spo, fpo-spo)
        spo := fpo + StrLen(m)
        if (m1)
            out .= %m2%
        else switch (m3)
        {
            case "a": out .= "`a"
            case "b": out .= "`b"
            case "f": out .= "`f"
            case "n": out .= "`n"
            case "r": out .= "`r"
            case "t": out .= "`t"
            case "v": out .= "`v"
            default: out .= m3
        }
    }
    return out SubStr(String, spo)
}