Englisch Русский Deutsch Български Français Español

Reguläre Ausdrücke (RegEx)

Einführung

Reguläre Ausdrücke sind eine praktische Möglichkeit, Textmuster anzugeben.

Mit regulären Ausdrücken können Sie Benutzereingaben validieren, nach Mustern wie E-Mail-Adressen oder Telefonnummern auf Webseiten oder in Dokumenten suchen und so weiter.

Nachfolgend auf einer einzigen Seite ein Spickzettel zum Thema reguläre Ausdrücke.

Zeichen

Einfache Übereinstimmungen

Jedes einzelne Zeichen passt zu sich selbst.

Eine Reihe von Zeichen stimmt mit dieser Reihe von Zeichen in der Eingabezeichenfolge überein.

RegEx passt auf
foobar foobar

Nicht druckbare Zeichen (Escape-Codes)

Um nicht druckbare Zeichen in regulären Ausdrücken darzustellen, verwenden Sie \x..:

RegEx passt auf
\xnn Zeichen mit Hex-Code nn
\x {nnnn} Zeichen mit Hex-Code nnnn (ein Byte für Klartext und zwei Byte für Unicode)
foo\x20bar foo bar (Beachten Sie das Leerzeichen in der Mitte)

Es gibt eine Reihe vordefinierter Escape-Codes für nicht druckbare Zeichen, genau wie in der Sprache C:

RegEx passt auf
\t (Horizontal-)Tabulator (HT / TAB), identisch mit \x09
\n Zeilenschaltung (Newline, NL), wie \x0a
\r Wagenrücklauf (carrier return, CR), das gleiche wie `` x0d``
\f Formularvorschub (FF), wie \x0c
\a Alarm (BEL), gleichbedeutend mit \x07
\e Escape (ESC), genauso wie \x1b
\cx
Kontrolltasten-Kombination (Ctrl-x)
Beispielsweise passt \ci auf die Zielsequenz
\x09, weil ctrl-i dem Wert 0x09 entspricht

Maskierung (Escaping)

Wenn Sie das Zeichen \ als solches, also nicht als Teil eines escape code darstellen wollen, setzen Sie einfach noch ein \ davor, also: \\.

Tatsächlich können Sie jedem Zeichen, das in regulären Ausdrücken eine Sonderbedeutung hat, ein \ als „„„Fluchtsymbol“““ (escape) voranstellen.

RegEx passt auf
\^FooBarPtr ^FooBarPtr (Dies ist ein literales ^ und nicht das Metazeichen für Zeilenanfang)
\[a\] [a] (Dies ist ein a in eckigen Klammern, nicht eine aus a bestehende Zeichenklasse)

Zeichenklassen

Benutzerdefinierte Zeichenklassen

Eine Zeichenklasse ist eine Liste von Zeichen in []. Die Klasse steht für genau ein beliebiges Zeichen aus dieser Liste.

RegEx passt auf
foob[aeiou]r foobar, foober usw., nicht aber foobbr, foobcr etc.

Sie können die Klasse „invertieren“ - wenn als erstes Zeichen nach dem [ ein ^ steht, dann steht die Klasse ebenfalls für ein beliebiges Zeichen, allerdings eines, das nicht in der Liste vorkommt.

RegEx passt auf
foob[^aeiou]r foobbr, foobcr usw., aber nicht foobar, foober etc.

Innerhalb einer Liste wird der Bindestrich - verwendet, um einen Bereich anzugeben, z.B. passt a-z für jedes Zeichen von a bis z (einschließlich).

Wenn ein Bindestrich - selbst Bestandteil der Klasse sein soll, schreiben Sie ihn an den Anfang oder das Ende der Liste oder maskieren ihn per vorangestelltem Rückwärtsschrägstrich (Backslash) \ .

If you want ] as part of the class you may place it at the start of list or escape it with a backslash.

RegEx passt auf
[-az] a, z und -
[az-] a, z und -
[a\-z] a, z und -
[az] Zeichen von a bis z
[\n-\x0D] Zeichen von #10 bis #13

Vordefinierte Zeichenklassen

Es gibt eine Reihe vordefinierter Zeichenklassen, die es erlauben, reguläre Ausdrücke übersichtlich zu halten.

RegEx passt auf
\w ein alphanumerisches Zeichen (einschließlich _)
\W ein nichtalphanumerisches Zeichen
\d ein numerisches Zeichen (dasselbe wie [0123456789])
\D ein nichtnumerisches Zeichen
s ein beliebiger Leerraum (dasselbe wie [ \t\n\r\f])
\S ein Zeichen, das keinen Leerraum ergibt
\h
Horizontaler Leerraum, d.h. ein Horizontaltabulator oder jedes Zeichen
in der Unicode-Kategorie „space separator“.
\H jedes Zeichen, das kein horizontaler Leerraum ist
\v
vertikaler Leerraum, jedes Zeichen, das
in die Unicode-Kategorie Trenner, Abstand (space separator) gehört.
\V jedes Zeichen, das nicht einen vertikalen Abstand liefert

Sie können \w, \d und \s innerhalb von benutzerdefinierten Zeichenklassen verwenden.

RegEx passt auf
foob\dr foob1r, foob6r usw., aber nicht foobar, foobbr usw.
foob[\w\s]r foobar,``foob r``, foobbr und so weiter, aber nicht``foob1r``, foob=r usw.

Bemerkung

TRegExpr

Die Zeichenklassen \w, \W, \s und \S sind in den Properties SpaceChars und WordChars definiert.

Sie können diese Zeichenklassen also auch neu definieren.

Grenzen

Zeilengrenzen

RegEx passt auf
^ Zeilenanfang
$ Zeilenende
\A Beginn des Textes (Stringanfang)
\Z Ende des Textes (Stringende)
. ein beliebiges Zeichen (innerhalb derselben Zeile)
^foobar foobar nur, wenn es am Anfang der Zeile steht
foobar$ foobar nur wenn es am Zeilenende steht
^foobar$ foobar nur wenn davor und danach kein sonstiges Zeichen innerhalb der Zeile steht
foob.r foobar, foobbr, foob1r usw.

Das Metazeichen ^ passt auf den Anfang ,``$`` auf das Ende der Zeichenkette.

Eventuell wollen Sie eine Zeichenfolge als mehrzeiligen Text behandeln, in dem ^ auch nach jedem internen Zeilenende und $ vor jedem Zeilenende passt. Dieses Verhalten erhalten Sie mit dem Schalter modifier / m .

Beachten Sie, dass sich in der Sequenz \x0D\x0A keine leere Zeile befindet.

Bemerkung

TRegExpr

Wenn Sie die Unicode-Version verwenden, dann stimmen ^/$ auch mit \x2028, \x2029, \x0B, \x0C or \x85 überein.

Die Anker \A und \Z funktionieren genau wie ^ and $, außer dass sie auch dann nicht mehrmals übereinstimmen, wenn die Option`modifier /m <#m>`_ eingeschaltet ist.

Das Metazeichen . passt von Haus aus auf jedes Zeichen, solange jedoch der Schalter Modifier / s Off ist, dann mit Ausnahme von Zeilentrennzeichen.

Beachten Sie, dass ^.*$ nicht auf eine Zeichenfolge inmitten von \x0D\x0A (CRLF) passt, denn die CRLF-Sequenz gilt als untrennbare Zeilenschaltung. Er passt hingegen auf die leeren Zeichenfolge in der Sequenz \x0A\x0D, weil dies einfach die falsche Reihenfolge ist, um als Zeilenschaltung interpretiert zu werden.

Bemerkung

TRegExpr

Feinheiten der mehrzeiligen Verarbeitung können mit den Eigenschaften LineSeparators und LinePairedSeparator justiert werden.

Sie können also Zeilenschaltungen im Unix-Stil \n oder im DOS/Windows-Stil \r\n verwenden oder beides (Standardverhalten wie oben beschrieben).

Wenn Sie eine mathematisch korrekte Beschreibung bevorzugen, können Sie sie unter www.unicode.org finden <http://www.unicode.org/unicode/reports/tr18/>__.

Wortgrenzen (Ankerpunkte)

RegEx passt auf
\b eine Wortgrenze
\B keine Wortgrenze (Ankerpunkt, der entweder beidseits von w oder W umgeben ist)

Eine Wortgrenze \b ist eine Stelle zwischen zwei Zeichen, von denen eines \w und das andere ein \W ist (Reihenfolge egal).

Quantifizierung

Quantifizierer

Auf jedes Element eines regulären Ausdrucks kann ein Quantifizierer folgen. Dieser gibt die Anzahl der Wiederholungen des Elements an.

RegEx passt auf
{n} genau n mal
{n,} mindestens n mal
{n,m} zumindest &quot;n&quot; aber nicht mehr als &quot;m&quot; mal
* nicht bis beliebig oft vorkommend, alternative Notation: {0,}
+ mindestens einmal vorkommend, alternative Notation: {1,}
? höchstens einmal vorkommend, alternative Notation: {0,1}

Innerhalb der geschweiften Klammern {n, m} geben Sie also die Mindest-( n ) und Höchstanzahl ( m ) für das Vorkommen des voranstehenden Elements an.

Die Kurzform {n} entspricht {n, n} und stimmt mit genau n Vorkommen überein.

Das {n,} entspricht „mindestens n Mal“.

Es gibt keine Obergrenze für n oder m.

Wenn eine geschweifte Klammer in einem anderen Kontext auftritt, wird sie als normales Zeichen behandelt.

RegEx passt auf
foob.*r foobar, foobalkjdflkj9r und foobr
foob.+r foobar, foobalkjdflkj9r` aber nicht foobr
foob.?r foobar, foobbr und foobr, aber nicht foobalkj9r
fooba{2}r foobaar
fooba{2,}r foobaar, foobaaar, foobaaaar usw.
fooba{2,3}r foobaar oder foobaaar, aber nicht foobaaaar
(foobar){8,10} 8, 9 oder 10 Vorkommen des Worts foobar (() ist ein Unterausdruck (subexpression))

Gier (greediness)

Im gierigen (greedy) Modus versuchen Quantifizierer so viele Übereinstimmungen wie möglich zu treffen, im trägen Modus so wenig wie möglich.

Standardmäßig verhalten sich alle Quantifizierer gierig. Durch Anhängen eines Fragezeichens ? kann man sie jedoch träge machen.

Für den String abbbbc:

RegEx passt auf
b+ bbbb
b+? b
b*? leerer String
b{2,3}? bb
b{2,3} bbb

Alle Quantifizierer können Sie in den trägen (non-greedy) Modus umschalten (modifier / g), im nachfolgenden Beispiel als Inline-Modifikation) gezeigt.

RegEx passt auf
(?-g)b+ b

Alternative Ausdrücke

Alternative Ausdrücke werden durch | getrennt.

fee|fie|foe passt also zu einem fee, fie oder foe in der Zielzeichenfolge (ebenso wie fee|fie|foe).

Zum ersten Ausdruck zählt alles vom letzten Musterbegrenzer ((, [ oder dem Anfang des Musters) bis vor das erste | ``, und der letzte Ausdruck umfasst alles nach dem letzten ``| zum nächsten Musterbegrenzer.

Klingt etwas kompliziert, daher setzt man üblicherweise die Alternativausdrücke in Klammern, um damit ihren Anfang und das Ende deutlicher erkennbar zu machen.

Die alternativen Ausdrücke werden von links nach rechts durchgetestet, und der erste passende wird verwendet.

Beispielsweise wird der reguläre Ausdruck foo|foot in der Zeichenfolge barefoot nur foo ergeben. Dies war nämlich die erste passende Alternative.

Denken Sie auch daran, dass | innerhalb eckiger Klammern als Literal interpretiert wird. Wenn Sie also [fee|fie|foe] schreiben, bedeutet das wirklich nur die Zeichenklasse [efio |].

RegEx passt auf
foo(bar|foo) foobar oder foofoo

Unterausdrücke (subexpressions)

Die Klammern (...) können auch verwendet werden, um Unterausdrücke in einem regulären Ausdruck zu definieren.

Bemerkung

TRegExpr

Positionen, Längen und tatsächliche Werte des Unterausdrucks werden in MatchPos,`MatchLen <tregexpr.html#matchlen>`_ und`Match <tregexpr.html#match>`_ angegeben.

Sie können sie durch Substitute ersetzen.

Unterausdrücke werden von links nach rechts durch ihre öffnenden Klammern nummeriert (einschließlich verschachtelter Unterausdrücke).

Der erste Unterausdruck hat die Nummer 1. Der gesamte reguläre Ausdruck hat die Nummer 0.

Zum Beispiel wird für die Eingabezeichenfolge foobar der reguläre Ausdruck (foo(bar)) folgendes finden:

Unterausdruck Wert
0 foobar
1 foobar
2 bar

Rückreferenzen

Die Metazeichen \1 bis \9 werden als Rückreferenzen interpretiert. \n stimmt dabei mit dem vorher übereinstimmenden Unterausdruck n überein.

RegEx passt auf
(.)\1+ aaaa und cc
(.+)\1+ auch abab und 123123

(['"]?)(\d+)\1 passt auf "13" (in doppelten Anführungszeichen) genauso wie auch auf '4' (in einfachen Anführungszeichen) oder 77 (ohne Anführungszeichen) usw.

Modifikatoren

Modifikatoren gestatten eine Verhaltensänderung regulärer Ausdrücke.

Sie können Modifikatoren sowohl global in Ihrem System festlegen als auch das Verhalten eines regulären Ausdrucks quasi an Ort und Stelle mithilfe von Inline-Modifikatoren ändern.

Bemerkung

TRegExpr

Um den Wert eines Modifikators festzulegen, verwenden Sie entweder ModifierStr oder die entsprechende TRegExpr-Eigenschaft namens `Modifier* <tregexpr.html#modifieri> __.

Die Standardwerte sind in den globalen Variablen definiert. Beispielsweise legt die globale Variable `` RegExprModifierX`` den Standardwert für die ModifierX-Eigenschaft fest.

i: Groß- und Kleinschreibung ignorieren

Groß- und Kleinschreibung wird nicht berücksichtigt. Verwendet ansonsten die in Ihrem System eingestellten Spracheinstellungen, siehe auch InvertCase.

m: mehrzeilige Zeichenketten

String zeilenweise als mehrzeiligen Text behandeln. ^ und $ finden damit Anfang und Ende in jeder beliebigen Zeile innerhalb des Strings.

Siehe auch Zeilengrenzen.

s: einzeilige Zeichenfolgen

Gesamte Zeichenfolge als einzelne Zeile behandeln. . passt dann auf jedes beliebige Zeichen, insbesondere auch auf Zeilenwechsel.

Siehe auch Zeilengrenzen, die normalerweise nicht gefunden würden.

g: Gierigkeit

Bemerkung

In TRegExpr nur als Modifikator verfügbar.

Wenn Sie auf Off umschalten, bringen Sie alle Quantifier vom gierigen (greedy) in den ``trägen (non-greedy)<#greedy>`__-Modus.

Wenn also der Modifikator /g Off ist, funktioniert + als +?, * als *? und so weiter.

Standardmäßig ist dieser Modifikator On.

x: erweiterte Syntax

Ermöglicht den regulären Ausdruck zu kommentieren und in mehrere Zeilen aufzuteilen.

Wenn dieser Modifikator On ist, ignorieren wir alle Leerräume, sofern sie weder maskiert noch innerhalb einer Zeichenklasse stehen.

Und das Zeichen `` #`` trennt Kommentare ab.

Eine mehrzeilige Darstellung macht übrigens reguläre Ausdrücke oft besser lesbar:

(
(abc) # Kommentar 1
#
(efg) # Kommentar 2
)

Dies bedeutet auch: wenn Sie literale Whitespace- oder # Zeichen in dem Muster (außerhalb einer Zeichenklasse, wo sie nicht von /x betroffen sind) angeben möchten, müssen Sie diese entweder maskieren oder als Oktal- oder Hex-Codes schreiben.

r: russische Zeichenbereiche

Bemerkung

In TRegExpr nur als Modifikator verfügbar.

In der russischen ASCII-Tabelle sind die Zeichen ё / Ё separat untergebracht.

Die übrigen großen und kleinen russische Schriftzeichen liegen jeweils in getrennten Bereichen, analog wie bei den englischen. Ich wollte eine praktische Kurzform.

Mit diesem Modifikator können Sie also statt [а-яА-ЯёЁ] einfach [а-Я] schreiben, wenn Sie sämtliche russischen Zeichen benötigen.

Wenn dieser Modifikator On ist:

RegEx passt auf
а-я Kleinbuchstaben, von а bis я sowie ё
А-Я Großbuchstaben, von A bis Я sowie Ё
а-Я Sämtliche russischen Schriftzeichen

Dieser Modifikator ist standardmäßig Ein.

Erweiterungen

(?=<lookahead>)

Eine Vorauschauannahme (look-ahead assertion) prüft auf ein nachfolgendes Vorkommen des Ausdrucks <look-ahead>, aber erfasst diese nicht mit.

Bemerkung

TRegExpr

Look-Ahead ist in TRegExpr nicht implementiert.

In vielen Fällen können Sie look ahead durch einen Unterausdruck ersetzen und einfach ignorieren, was in diesem Unterausdruck erfasst wird.

Zum Beispiel arbeitet (blah) (? = foobar) (blah) prinzipiell genauso wie (blah) (foobar) (blah). In der letzteren Variante müssen Sie lediglich den mittleren Unterausdruck ausschließen - verwenden Sie also den Ausdruck Match [1] + Match [3] und ignorieren Sie Match[2].

Dies ist lediglich ein bisschen unpraktischer als in einer look-ahead-Version, in welcher Sie den gesamten Match[0] verwenden könnten, weil der vom look ahead erfasste Teil zwar gesucht, aber nicht in das Ergebnis mit einbezogen würde.

(?:<non-capturing group>)

?: wird genutzt, wenn man einen Ausdruck zwar gruppieren, aber keine Rückwärtsreferenz auf den passenden Textabschnitt speichern möchte.

Auf diese Weise können Sie Ihren Regex in Unterausdrücke gliedern, ohne unnötig Speicherplatz und Verarbeitungszeit für die Ergebniserfassung zu verschwenden:

RegEx passt auf
(https?|ftp)://([^/\r\n]+) https und sorokin.engineer in https://sorokin.engineer
(?:https?|ftp)://([^/\r\n]+) nur sorokin.engineer in https://sorokin.engineer

(? imsgxr-imsgxr)

Damit kann man innerhalb von regulären Ausdrücken Modifikatoren „im Handumdrehen“ ändern.

Das Praktische daran kann sein, dass die Änderung direkt im Regex nur lokalen Gültigkeitsbereich hat. Sie betrifft sogar nur denjenigen Anteil des regulären Ausdrucks, der auf den Operator (?imsgxr-imsgxr) folgt.

Innerhalb eines Unterausdrucks gesetzt, wirkt sich der Operator nur innerhalb dessen aus, wiederum auch nur auf den Teil des Teilausdrucks, der auf den Operator folgt. In ((?i)Saint)-Petersburg betrifft es nur den Teilausdruck ((?i) Saint), so dass sankt-Petersburg, aber nicht Sankt-petersburg passt .

RegEx passt auf
(?i)Sankt-Petersburg `` Sankt-petersburg`` und `` Sankt-Petersburg``
(?i)Sankt-(?-i)Petersburg Sankt Petersburg aber nicht Sankt petersburg
(?i)(Sankt-)?Petersburg Sankt-petersburg und sankt-petersburg
((?i)Sankt-)?Petersburg saint-Petersburg, aber nicht saint-petersburg

(?#Text)

Ein Kommentar („Text“ wird ignoriert).

Beachten Sie, dass der Kommentar durch die nächstfolgende ) geschlossen wird. Es gibt also keine Möglichkeit, eine schließende runde Klammer ) in den Kommentar einzufügen.

Nachwort

In diesem alten Blogeintrag aus dem vorigen Jahrhundert erläutere ich einige Anwendungsfälle von regulären Ausdrücken.