Skip to content

Latest commit

 

History

History
533 lines (382 loc) · 27.1 KB

README-de.md

File metadata and controls

533 lines (382 loc) · 27.1 KB


Learn Regex

Translations:

Was sind Reguläre Ausdrücke?

Ein regulärer Ausdruck ist eine Gruppe von Buchstaben und Symbolen, die benutzt werden um ein bestimmtes Muster in einem Text zu finden. Ein regulärer Ausdruck ist ein Muster, das mit einem zu durchsuchenden Text von links nach rechts abgeglichen wird. Die Bezeichnung "Regulärer Ausdruck" ist in der Praxis unüblich und stattdessen wird häufig die Englische Abkürzung "Regex" oder "RegExp" (regular expression) verwendet. Reguläre Ausdrücke werden verwendet, um Fragemente eines Textes zu ersetzen, Formulare zu validieren, Segmente eines Textes anhand eines Musters zu extrahieren und für vieles mehr.

Angenommen, Du schreibst eine Anwendung und möchtest die Regeln definieren, nach denen ein Benutzer seinen Benutzernamen auswählen kann. Wir möchten festlegen, dass der Benutzernamen Buchstaben, Ziffern, Unter- und Bindestriche beinhalten darf. Außerdem wollen wir die Anzahl der Zeichen limitieren, damit der Name nicht unlesbar wird. Dazu verwenden wir den folgenden regulären Ausdruck:

Regular expression

Der abgebildete reguläre Ausdruck erlaubt bspw. Die Eingaben john_doe, jo-hn_doe und john12_as. Die Eingabe Jo wird nicht akzeptiert, weil sie einen Großbuchstaben enthält und zu kurz ist.

Inhaltsverzeichnis

1. Einfache Muster

Ein regulärer Ausdruck ist einfach nur ein Muster von Zeichen, welches für eine Suche in Text genutzt wird. Der reguläre Ausdruck the heißt zum Beispiel: der Buchstabe t, gefolgt von dem Buchstaben h, gefolgt von dem Buchstaben e.

"the" => The fat cat sat on the mat.

Teste den regulären Ausdruck

Der reguläre Ausdruck 123 entspricht der Zeichenkette 123. Auf Übereinstimmung mit einer Zeichenkette wird er überprüft, indem jedes Zeichen in dem regulären Ausdruck nacheinander mit jedem Zeichen der Zeichenkette verglichen wird. Reguläre Ausdrücke berücksichtigen normalerweise Groß- und Kleinschreibung, sodass etwa der Ausdruck The nicht mit der Zeichenkette the übereinstimmen würde.

"The" => The fat cat sat on the mat.

Teste den regulären Ausdruck

2. Metazeichen

Metazeichen sind Bausteine von regulären Ausdrücken. Sie stehen nicht für sich selbst, sondern haben eine besondere Bedeutung und werden in spezieller Weise interpretiert. Einige Metazeichen erhalten eine andere Bedeutung oder überhaupt erst eine besondere Bedeutung innerhalb eckiger Klammern []. Folgende Metazeichen gibt es:

Metazeichen Beschreibung
. Der Punkt entspricht jedem einzelnen Zeichen, außer Zeilenumbrüchen.
[ ] Zeichenklasse, entspricht jedem Zeichen innerhalb der eckigen Klammern.
[^ ] Negierte Zeichenklasse, entspricht jedem Zeichen welches nicht innerhalb der eckigen Klammern definiert ist.
* Entspricht 0 oder mehr Wiederholungen des vorhergehenden Teilausdrucks.
+ Entspricht 1 oder mehr Wiederholungen des vorhergehenden Teilausdrucks.
? Macht den vorhergehenden Teilausdruck optional.
{n,m} Entspricht mindestens "n", aber nicht mehr als "m" Wiederholungen des vorhergehenden Teilausdrucks.
(xyz) Gruppierung, entspricht den Zeichen xyz in der exakten Reihenfolge.
| Alternation, entspricht entweder dem Teilausdruck vor oder nach dem |.
\ Escaped das nachfolgende Zeichen. Dies ermöglicht es Zeichen zu blockieren [ ] ( ) { } . * + ? ^ $ \ |
^ Entspricht dem Anfang der Eingabe.
$ Entspricht dem Ende der Eingabe.

2.1 Punkt

Der Punkt . ist das einfachste Beispiel für ein Metazeichen. Er steht für jedes beliebiges Zeichen mit der Ausnahme von Zeilenumbrüchen/Enter-Zeichen. Als Beispiel, der reguläre Ausdruck .ar bedeutet: ein beliebiges Zeichen, gefolgt von dem Buchstaben a, gefolgt vom Buchstaben r.

".ar" => The car parked in the garage.

Teste den regulären Ausdruck

2.2 Zeichenklasse

Zeichenklassen werden auch als Zeichenmengen oder -sätze bezeichnet (eng. character set/class). Sie werden in eckige Klammern definiert. Um eine Zeichenfolge wie A-Z oder 0-9 zu definieren, kann ein Bindestrich - verwendet werden. Die Reihenfolge sonstiger Zeichen innerhalb der eckigen Klammern spielt keine Rolle. Zum Beispiel bedeutet der reguläre Ausdruck [Tt]he: ein groß geschriebenes T oder ein kleingeschriebenes t, gefolgt vom Buchstaben h und weiter gefolgt vom Buchstaben e.

"[Tt]he" => The car parked in the garage.

Teste den regulären Ausdruck

Ein Punkt in einer Zeichenklasse bedeutet, anders als sonst, einen wörtlichen Punkt. Der reguläre Ausdruck ar[.] bedeutet: ein kleingeschriebenes Zeichen a, gefolgt vom kleingeschriebenen Buchstaben r, gefolgt von einem Punkt-Zeichen ..

"ar[.]" => A garage is a good place to park a car.

Teste den regulären Ausdruck

2.2.1 Negierte Zeichenklasse

Im Allgemeinen stellt das Zirkumflex ^ den Anfang einer Zeichenkette dar. Wenn es aber nach der öffnenden eckigen Klammer gesetzt wird, dann wird die Zeichenklasse negiert (eng. negated character set). Als Beispiel, der reguläre Ausdruck [^c]ar bedeutet: ein beliebiges Zeichen außer c, gefolgt vom Buchstaben a, gefolgt vom Buchstaben r.

"[^c]ar" => The car parked in the garage.

Teste den regulären Ausdruck

2.3 Wiederholungen

Die Metazeichen +, * und ? bieten einen einfachen Weg, anzugeben, wie oft sich ein bestimmter Teilausdruck wiederholen soll. Sie gehören damit zu den sogenannten "Quantifizierern" (eng. quantifier). Sie können sich je nach Situation unterschiedlich verhalten.

2.3.1 Stern

Das Symbol * stimmt mit beliebig vielen Wiederholungen des vorhergehenden Teilausdrucks überein. Der Ausdruck a* heißt: null, eins oder mehrere as in Folge. Da sich der Stern auf Teilausdrücke bezieht, kann er auch bspw. hinter einer Zeichenklasse stehen und stimmt dann mit beliebig vielen Zeichen aus der Klasse in Folge überein. Zum Beispiel bedeutet der Ausdruck [a-z]*: eine beliebige Anzahl von Kleinbuchstaben in Folge.

"[a-z]*" => The car parked in the garage #21.

Teste den regulären Ausdruck

Das *-Symbol kann zusammen mit dem Metazeichen . verwendet werden, um mit einer vollkommen beliebigen Zeichenkette übereinzustimmen .*. Es kann auch mit der vordefinierten Zeichenklasse \s verwendet werden, um mit beliebig viel Leerraum (Leerzeichen, Tabulatoren, Zeilenumbrüchen) übereinzustimmen. Der Ausdruck \s*cat\s* heißt zum Beispiel: null oder mehrere Leerzeichen, gefolgt von dem Buchstaben c, gefolgt vom Buchstaben a, gefolgt vom Buchstaben t und schließlich gefolgt von null oder mehreren Leerzeichen.

"\s*cat\s*" => The fat cat sat on the concatenation.

Teste den regulären Ausdruck

2.3.2 Plus

Das +-Symbol stimmt mit einer oder mehr Wiederholungen des vorhergehenden Teilausdrucks überein. Der reguläre Ausdruck c.+t bedeutet: Buchstabe c, gefolgt von mindestens einem beliebigen Zeichen, gefolgt vom Buchstaben t. Das t ist dabei das letzte t in der hier zu sehenden Übereinstimmung, wobei es hier auch weitere Übereinstimmungen gäbe (siehe "Teste den regulären Ausdruck").

"c.+t" => The fat cat sat on the mat.

Teste den regulären Ausdruck

2.3.3 Fragezeichen

In regulären Ausdrücken sorgt das Metazeichen ? dafür, dass der vorhergehende Teilausdruck optional wird. Somit stimmt es mit null oder einer Übereinstimmung des Teilausdrucks überein. Zum Beispiel heißt der reguläre Ausdruck [T]?he: ein oder kein T, gefolgt von dem Buchstaben h, gefolgt von dem Buchstaben e.

"[T]he" => The car is parked in the garage.

Teste den regulären Ausdruck

"[T]?he" => The car is parked in the garage.

Teste den regulären Ausdruck

2.4 Geschweifte Klammern

Geschweifte Klammern {} gehören wie die zuvor behandelten Metazeichen zu den Quantifizierern. Sie werden verwendet, um genau anzugeben wie oft ein Teilausdruck minimal und maximal hintereinander übereinstimmen muss. Zum Beispiel bedeutet der reguläre Ausdruck [0-9]{2,3}: Mindestens zwei, aber maximal drei Ziffern (Zeichenfolge 0-9) hintereinander.

"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.

Teste den regulären Ausdruck

Die zweite Zahl kann ausgelassen werden. Somit heißt der Ausdruck [0-9]{2,}: zwei oder mehr Ziffern in Folge. Wenn wir auch das Komma entfernen, heißt [0-9]{3}: genau drei Ziffern in Folge.

"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.

Teste den regulären Ausdruck

"[0-9]{3}" => The number was 9.9997 but we rounded it off to 10.0.

Teste den regulären Ausdruck

2.5 Gruppierungen

Eine Gruppierung (eng. capturing group) fasst eine Gruppe von Teilausdrücken in Klammern (...) zusammen. Eine Gruppierung selbst ist ebenfalls ein Teilausdruck, weshalb Quantoren wie {}, * oder ? auf sie angewendet werden können. Zum Beispiel stimmt der reguläre Ausdruck (ab)* mit null oder mehr Vorkommen von a und b hintereinander überein. Auch das "Oder"-Metazeichen | kann innerhalb einer Gruppierung verwendet werden. Der reguläre Ausdruck (c|g|p)ar bedeutet: kleines c, g oder p, gefolgt vom Buchstaben a, gefolgt vom Buchstaben r. Dies ist äquivalent zu [cgp]ar.

"(c|g|p)ar" => The car is parked in the garage.

Teste den regulären Ausdruck

Gruppierungen stimmen nicht nur mit Zeichenketten überein, sondern "merken" sich auch die übereinstimmenden Zeichen in der Gruppe für die Verwendung in der Elternsprache (auch Rückwärtsreferenz genannt). Die Elternsprache kann Python, JavaScript oder sonst irgendeine Sprache sein, die reguläre Ausdrücke implementiert.

2.5.1 Gruppierungen ohne Rückwärtsreferenz

Gruppierungen ohne Rückwärtsreferenz (eng. non-capturing groups) sind Gruppierungen, die nur mit den Zeichen übereinstimmen, diese aber nicht für spätere Verwendung zwischenspeichern. Solche Gruppierungen werden mit einem ?, gefolgt von einem : in Klammern (...) definiert. Somit gleicht der reguläre Ausdruck (?:c|g|p)ar dem Ausdruck (c|g|p)ar in seiner Übereinstimmung mit den Zeichenketten, aber im Gegensatz erzeugt er keine Rückwärtsreferenz.

"(?:c|g|p)ar" => The car is parked in the garage.

Teste den regulären Ausdruck

Gruppierungen ohne Rückwärtsreferenz können für Finden-und-Ersetzen oder in Kombination mit normalen Gruppierungen nützlich sein, um den Überblick zu behalten, wenn auf Basis der Übereinstimmungen eine Ausgabe erzeugt wird. Siehe auch 4. Lookaround.

2.6 Alternation

In einem regulären Ausdruck wird der Trennstrich | verwendet, um Alternativen (eng. alternation) zu definieren. Alternation ist wie ein "ODER" zwischen mehreren Teilausdrücken. Nun könnte man annehmen, dass Zeichenklassen und Alternation auf die gleiche Art und Weise funktionieren. Aber der große Unterschied zwischen diesen beiden ist, dass Zeichenklassen für einzelne Zeichen funktionieren, während für Alternationen beliebige Teilausdrücke verwendet werden können. So heißt der reguläre Ausdruck (T|t)he|car beispielsweise: Entweder ein großes T oder kleines t, dann der Buchstabe h gefolgt vom Buchstaben e ODER c, gefolgt von a, gefolgt von r. Man beachte die Klammern, die zur Trennung der einen Alternation von der anderen gesetzt wurden.

"(T|t)he|car" => The car is parked in the garage.

Teste den regulären Ausdruck

2.7 Escaping

Der Backslash \ wird in regulären Ausdrücken verwendet, um die besondere Bedeutung des folgenden Zeichens aufzuheben (eng. escape) oder ihm eine besondere Bedeutung zu verleihen (s. Vordefinierte Zeichenklassen). Er erlaubt es, für andere Zwecke reservierte Zeichen wie die Metazeichen { } [ ] / \ + * . $ ^ | ? als Literale, also wörtliche Übereinstimmungen zu nutzen. Um mit einem besonderen Zeichen wortwörtlich übereinzustimmen, muss es auf ein \ folgen.

Der reguläre Ausdruck . zum Beispiel wird benutzt, um mit einem beliebigen Zeichen übereinzustimmen. Der Ausdruck (f|c|m)at\.? hebt diese Bedeutung auf: f, c oder m, gefolgt von a, gefolgt von t, schließlich gefolgt von einem optionalen ..

"(f|c|m)at\.?" => The fat cat sat on the mat.

Teste den regulären Ausdruck

2.8 Anker

In regulären Audrücken werden Anker (eng. anchor) verwendet, um zu überprüfen, ob der Teilausdruck mit dem Anfang oder dem Ende der Teilausgabe übereinstimmt. Es gibt zwei Arten von Ankern: das Zirkumflex ^ stimmt mit dem Anfang, das Dollarzeichen $ mit dem Ende der Eingabe überein.

2.8.1 Zirkumflex

Das Zirkumflex ^ (eng. caret) wird benutzt um zu überprüfen, ob der Teilausdruck mit dem Anfang der Zeichenkette übereinstimmt. Wenn wir den regulären Ausdruck ^a auf die Eingabe abc anwenden, stimmt er mit a überein. Aber wenn wir auf die gleiche Eingabe den Ausdruck ^b anwenden, gibt es keine Übereinstimmungen, weil in der Zeichenkette abc kein "b" am Anfang steht. Schauen wir uns einen anderen Ausdruck an: ^(T|t)he. Dieser bedeutet: kleines t oder großes T am Anfang der Eingabe, gefolgt von h, gefolgt von e.

"(T|t)he" => The car is parked in the garage.

Teste den regulären Ausdruck

"^(T|t)he" => The car is parked in the garage.

Teste den regulären Ausdruck

2.8.2 Dollar

Das Dollarzeichen $ wird benutzt um zu überprüfen, ob der Teilausdruck mit dem Ende der Zeichenkette übereinstimmt. Der reguläre Ausdruck (at\.)$ etwa bedeutet: a, gefolgt von t und dann . am Ende der Eingabe.

"(at\.)" => The fat cat. sat. on the mat.

Teste den regulären Ausdruck

"(at\.)$" => The fat cat. sat. on the mat.

Teste den regulären Ausdruck

3. Vordefinierte Zeichenklassen

Reguläre Ausdrücke haben Kürzel für die am häufigsten benötigten Zeichenklassen, was viele Ausdrücke vereinfacht und kürzer macht. Das sind die vordefinierten Zeichenklassen:

Shorthand Description
. Beliebiges Zeichen außer Zeilenumbruch
\w Stimmt mit alphanumerischen Zeichen überein: [a-zA-Z0-9_]
\W Stimmt mit nicht-alphanumerischen Zeichen überein: [^\w]
\d Stimmt mit Ziffern überein: [0-9]
\D Stimmt mit Zeichen, die keine Ziffern sind überein: [^\d]
\s Stimmt mit Leerraum überein: [\t\n\f\r\p{Z}]
\S Stimmt mit allem außer Leerraum überein: [^\s]

4. Umsehen (Lookaround)

Lookbehind ("zurückschauen") und Lookahead ("vorausschauen") (auch Lookaround ("Umsehen") genannt) sind besondere Arten von Gruppierungen ohne Rückwärtsreferenz (zur Erinnerung: das sind Gruppierungen, die zwar mit dem Muster übereinstimmen, aber sich die Übereinstimmung nicht "merken"). Sie werden in Situationen verwendet, wo wir ein Muster einfangen wollen, dem andere Muster folgen oder vorhergehen. Zum Beispiel wollen wir alle Zahlen aus der Zeichenkette $4.44 and $10.88, vor denen ein Dollarzeichen $ steht. Wir benutzen dafür den folgenden regulären Audruck: (?<=\$)[0-9.]*. Das heißt: Stimme mit allen Zeichenketten überein, die Ziffern 0-9 oder Punkte . enthalten und die einem Dollarzeichen $ folgen.

Das sind die Lookarounds, die es gibt:

Symbol Name
?= Positiver Lookahead
?! Negativer Lookahead
?<= Positiver Lookbehind
?<! Negativer Lookbehind

4.1 Positives Vorausschauen (Lookahead)

Ein positiver Lookahead versichert, dass der Teilausdruck vor dem Lookahead von dem Lookahead-Teilausdruck gefolgt wird. Das Ergebnis der Übereinstimmung beinhaltet dabei nur den Teilausdruck vor dem Lookahead. Klammern werden genutzt, um positive Lookaheads zu definieren. Nach der öffnenden Klammer müssen ein Fragezeichen und ein Gleichheitszeichen stehen: (?=...). Der Lookahead-Ausdruck wird nach dem Gleichheitszeichen notiert. Zum Beispiel bedeutet der reguläre Ausdruck (T|t)he(?=\sfat): kleines t oder großes T, dann ein h, dann ein e. Der positive Lookahead in den Klammern ist eine zusätzliche Bedingung, die dafür sorgt, dass der Ausdruck nur mit the oder The übereinstimmt, welches von einem Leerzeichen und den Buchstaben f, a und t gefolgt wird.

"(T|t)he(?=\sfat)" => The fat cat sat on the mat.

Teste den regulären Ausdruck

4.2 Negatives Vorausschauen (Lookahead)

Negative Lookaheads werden verwendet, um alle Übereinstimmungen in einer Zeichenkette zu bekommen, auf die nicht ein bestimmtes Muster folgt. Ein Negativer Lookahead wird wie ein positiver Lookahead definiert, nur dass statt einem Gleichheitszeichen ein Ausrufezeichen ! benutzt wird, d.h. (?!...). Aus dem regulären Ausdruck (T|t)he(?!\sfat) folgt somit: alle The oder the, auf die kein Leerzeichen und das Wort fat folgt, stimmen überein.

"(T|t)he(?!\sfat)" => The fat cat sat on the mat.

Teste den regulären Ausdruck

4.3 Positives Zurückschauen (Lookbehind)

Positive Lookbehinds werden verwendet, um alle Übereinstimmungen in einer Zeichenkette zu bekommen, denen ein bestimmtes Muster vorhergeht. Postive Lookbehinds werden mit (?<=...) notiert. Der reguläre Ausdruck (?<=(T|t)he\s)(fat|mat) zum Beispiel bedeutet: alle fat oder mat, die nach The oder the kommen, stimmen überein.

"(?<=(T|t)he\s)(fat|mat)" => The fat cat sat on the mat.

Teste den regulären Ausdruck

4.4 Negativer Lookbehind

Negative Lookbehinds werden verwendet, um alle Übereinstimmungen in einer Zeichenkette zu bekommen, denen nicht ein bestimmtes Muster vorhergeht. Negative Lookbehinds werden mit (?<!...) notiert. Der reguläre Ausdruck (?<!(T|t)he\s)(cat) zum Beispiel bedeutet: alle cat, die nicht nach The oder the kommen, stimmen überein.

"(?<!(T|t)he\s)(cat)" => The cat sat on cat.

Teste den regulären Ausdruck

5. Modifikatoren

Modifikatoren (eng. flags oder modifiers) verändern die Ausgabe eines regulären Ausdrucks. Sie können in beliebiger Kombination oder Reihenfolge genutzt werden und sind ein integraler Bestandteil regulärer Ausdrücke.

Modifikator Beschreibung
i Schreibungsunabhängig: Unterschiede bei Groß- und Kleinschreibung in den Mustern werden ignoriert.
g Globale Suche: Die Suche geht durch die gesamte Eingabe.
m Mehrzeilig: Anker-Metazeichen funktionieren für Anfang/Ende jeder Zeile.

5.1 Groß-/Kleinschreibung unempfindlich

Der i Modifikator wird benutzt, um unabhängige Übereinstimmungen bei der Groß-/Kleinschreibung zu finden. Zum Beispiel heißt der reguläre Ausdruck /The/gi: großes T, gefolgt von h, dann e. Und am Ende des Ausdrucks ist der i Modifikator zu finden, welcher der Maschine zu verstehen gibt, dass Groß- und Kleinschreibung ignoriert werden sollen. Wie zu sehen ist, wird auch der g Modifikator benutzt, da wir die gesamte Eingabe nach dem Muster absuchen wollen.

"The" => The fat cat sat on the mat.

Teste den regulären Ausdruck

"/The/gi" => The fat cat sat on the mat.

Teste den regulären Ausdruck

5.2 Globale Suche

Der g Modifikator wird benutzt, um eine globale Suche durchzuführen (alle Übereinstimmungen finden, nicht nach der ersten aufhören). Zum Beispiel heißt der reguläre Ausdruck /.(at)/g: ein beliebiges Zeichen (außer Zeilenumbruch), gefolgt von a, gefolgt von t. Weil wir den g Modifikator angegeben haben, findet der reguläre Ausdruck nun alle Übereinstimmungen in der Eingabe, nicht nur die erste (was das Standardverhalten ist).

"/.(at)/" => The fat cat sat on the mat.

Teste den regulären Ausdruck

"/.(at)/g" => The fat cat sat on the mat.

Teste den regulären Ausdruck

5.3 Mehrzeilig

Der m Modifikator wird benutzt, um eine mehrzeilige Suche durchzuführen. Wie zuvor erwähnt werden Anker (^, $) genutzt, um zu überprüfen, ob ein Muster dem Anfang oder dem Ende der Eingabe entspricht. Wenn wir stattdessen wollen, dass Anker zeilenweise funktionieren, nutzen wir den m Modifikator. Zum Beispiel bedeutet der reguläre Ausdruck /at(.)?$/gm: a, gefolgt von t, dann optional ein beliebiges Zeichen außer Zeilenumbruch. Wegen des m Modifikators wird das Muster nun auf das Ende jeder Zeile statt nur das Ende der gesamten Eingabe angewandt.

"/.at(.)?$/" => The fat
                cat sat
                on the mat.

Teste den regulären Ausdruck

"/.at(.)?$/gm" => The fat
                  cat sat
                  on the mat.

Teste den regulären Ausdruck

6. Gierige vs. faule Übereinstimmung

Standardmäßig finden reguläre Ausdrücke Übereinstimmungen mit Gier (eng. greed), d.h. es wird nach den längsten Übereinstimmungen gesucht. Mit ? können wir faul (eng. lazy) suchen, d.h. es wird nach den kürzesten Übereinstimmungen gesucht.

"/(.*at)/" => The fat cat sat on the mat.

Teste den regulären Ausdruck

"/(.*?at)/" => The fat cat sat on the mat.

Teste den regulären Ausdruck

Beitragen

  • Öffne Pull Requests mit Verbesserungen
  • Diskutiere Ideen in Issues
  • Erzähl es anderen
  • Gib Rückmeldung Twitter URL

Lizenz

MIT © Zeeshan Ahmad