RegExMatch() [v1.0.45+]

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

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

Parameter

Heuhaufen

Eine Zeichenkette, die 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 einem ")"-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 dasselbe wie abc.

AusgabeVar

Wenn weggelassen, wird keine Ausgabevariable verwendet. Andernfalls geben Sie eine Ausgabevariable an, in der bestimmte Daten gespeichert werden sollen, je nachdem, welcher der folgenden Modi verwendet wird.

Modus 1 (Standard): Geben Sie eine Ausgabevariable 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 im nächsten Absatz beschriebenen Array-Elemente leer gemacht.

Wenn erfassende Teilsuchmuster in NadelRegEx vorhanden sind, werden ihre Übereinstimmungen in ein Pseudo-Array mit dem Basisnamen AusgabeVar gespeichert. Wenn die Variable z.B. Match heißt, 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 via Name gespeichert, nicht via Nummer. Zum Beispiel wird eine Teilzeichenkette, die dem benannten Teilsuchmuster (?P<Jahr>\d{4}) entspricht, in MatchJahr gespeichert. Wenn für ein bestimmtes Teilsuchmuster keine Übereinstimmung gefunden wird (oder die Funktion 0 zurückgibt), wird die entsprechende Variable leer gemacht.

Um ein Pseudo-Array innerhalb einer Funktion global statt lokal zu machen, deklarieren Sie den Basisnamen des Pseudo-Arrays (z.B. Match) als globale Variable, bevor Sie ihn verwenden. Umgekehrt gilt dasselbe für 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). Wenn erfassende Teilsuchmuster vorhanden sind, werden ihre Positionen und Längen in zwei Pseudo-Arrays gespeichert: AusgabeVarPos und AusgabeVarLen. Wenn der Basisname der Variable z.B. Match ist, wird die Position (beginnend bei 1) und Länge der Übereinstimmung des ersten Teilsuchmusters in MatchPos1 bzw. 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 via Name gespeichert, nicht via Nummer (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. Dieses Objekt kann verwendet werden, um die Position, die Länge und den Wert der gesamten Übereinstimmung und, falls vorhanden, jedes erfassten Teilsuchmusters abzurufen.

StartPos

Wenn weggelassen, wird standardmäßig 1 verwendet (der Anfang von Heuhaufen). Andernfalls geben Sie 2 an, um beim zweiten Zeichen zu beginnen, 3, um beim dritten zu beginnen, und so weiter. Wenn StartPos die Länge von Heuhaufen überschreitet, beginnt die Suche bei der leeren Zeichenkette am Ende von Heuhaufen (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 0 angegeben werden, um beim letzten Zeichen zu beginnen, -1, um beim vorletzten zu beginnen, und so weiter. Wenn StartPos über das linke Ende von Heuhaufen hinausgeht, wird alles in Heuhaufen durchsucht.

Egal welcher Wert für StartPos angegeben ist, der Rückgabewert ist immer relativ zum ersten Zeichen von Heuhaufen. 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 Heuhaufen zurück. Position 1 ist das erste Zeichen. 0 wird zurückgegeben, wenn das Suchmuster nicht gefunden wurde. Wenn ein Fehler auftritt (z.B. ein Syntaxfehler in NadelRegEx), wird eine leere Zeichenkette zurückgegeben und ErrorLevel auf einen der unten genannten Werte ungleich 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

Siehe RegEx-Kurzübersicht für Optionen wie z.B. i)abc, das die Groß-/Kleinschreibung-Sensitivität 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, falls vorhanden.

Match[N]: Wenn N 0 oder die Nummer/der Name eines gültigen Teilsuchmusters ist, dann ist dies äquivalent zu Match.Value(N). Andernfalls 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: 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:

Wenn N angegeben ist, können eckige anstelle von runden Klammern verwendet werden.

Performanz

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

Aus Performanzgründen werden die 100 zuletzt verwendeten regulären Ausdrücke zwischengespeichert (in kompilierter Form).

Die S-Option kann in bestimmten Fällen die Performanz 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}). Diese Namen können maximal 32 Zeichen lang sein und dürfen nur aus alphanumerischen Zeichen und Unterstrichen bestehen. Die folgende Einschränkung gilt nicht für den O-Modus (Match-Objekt): Obwohl benannte Teilsuchmuster während der RegEx-Operation selbst auch über ihre 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 z.B. "Jahr" das erste Teilsuchmuster ist, wird AusgabeVarJahr auf die gefundene Teilzeichenkette gesetzt, während der Inhalt von AusgabeVar1 unverändert bleibt (falls vorhanden). Wenn aber nach "Jahr" ein namenloses Teilsuchmuster folgt, wird dessen Fund in AusgabeVar2 gespeichert, nicht in AusgabeVar1.

Die meisten Zeichen wie abc123 können ganz normal in einem regulären Ausdruck verwendet werden. Anders verhält es sich mit den Metazeichen \.*?+[{|()^$: Um ihre spezielle Bedeutung außer Kraft zu setzen, muss ihnen ein umgekehrter Schrägstrich vorangestellt werden. Zum Beispiel ist \. ein normaler Punkt und \\ ein normaler umgekehrter Schrägstrich. 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 dasselbe 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 PCRE (Perl-compatible Regular Expressions); 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)

Übliche Quellen für Textdaten: FileRead, UrlDownloadToFile, Clipboard, GUI-Eingabefelder

Beispiele

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

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

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

Meldet 7, weil $ die Übereinstimmung am Ende erzwingt.

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

Meldet 1, weil eine Übereinstimmung dank der i-Option (nicht Groß-/Kleinschreibung-sensitiv) gefunden wurde.

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

Meldet 1 und speichert "XYZ" in TeilMust1.

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

Meldet 7 statt 1 wegen der Startposition 2 statt 1.

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

Zeigt 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" an

Ruft die Endung einer Datei ab. 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 löst die folgende Funktion Variablenreferenzen und Escapesequenzen in einer Zeichenkette auf. Außerdem zeigt dieses Beispiel, wie alle Übereinstimmungen in einer Zeichenkette gefunden werden können, anstatt bei der ersten Übereinstimmung zu stoppen (vergleichbar mit dem RegEx-g-Flag von JavaScript).

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)
}