diff --git a/README.md b/README.md index 4ac6e0f..1428d17 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ ## Translations: * [English](README.md) +* [German](translations/README-de.md) * [Español](translations/README-es.md) * [Français](translations/README-fr.md) * [Português do Brasil](translations/README-pt_BR.md) diff --git a/translations/README-de.md b/translations/README-de.md new file mode 100644 index 0000000..f55f728 --- /dev/null +++ b/translations/README-de.md @@ -0,0 +1,528 @@ +

+
+ + Learn Regex + +

+ +## Translations: + +* [English](../README.md) +* German +* [Español](../translations/README-es.md) +* [Français](../translations/README-fr.md) +* [Português do Brasil](../translations/README-pt_BR.md) +* [中文版](../translations/README-cn.md) +* [日本語](../translations/README-ja.md) +* [한국어](../translations/README-ko.md) +* [Turkish](../translations/README-tr.md) +* [Greek](../translations/README-gr.md) +* [Magyar](../translations/README-hu.md) +* [Polish](../translations/README-pl.md) +* [Русский](../translations/README-ru.md) +* [Tiếng Việt](../translations/README-vn.md) + +## 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 Ausdruch 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`. Der Eingabe `Jo` wird nicht akzeptiert, da sie einen Großbuchstaben enthält und zu kurz ist. + +## Inhaltsverzeichnis + +- [Einfache Muster](#1-einfache-muster) +- [Metazeichen](#2-metazeichen) + - [Punkt](#21-punkt) + - [Zeichenklasse](#22-zeichenklasse) + - [Negierte Zeichenklasse](#221-negierte-zeichenklasse) + - [Wiederholungen](#23-wiederholungen) + - [Stern *](#231-stern) + - [Plus +](#232-plus) + - [Fragezeichen ?](#233-fragezeichen) + - [Geschweifte Klammern {}](#24-geschweifte-klammern) + - [Gruppierung ()](#25-gruppierung) + - [Alternation |](#26-alternation) + - [Escaping \](#27-escaping) + - [Anker](#28-anker) + - [Zirkumflex ^](#281-zirkumflex) + - [Dollar $](#282-dollar) +- [Vordefinierte Zeichenklassen](#3-vordefinierte-zeichenklassen) +- [Lookaround](#4-lookaround) + - [Positiver Lookahead](#41-positiver-lookahead) + - [Negativer Lookahead](#42-negativer-lookahead) + - [Positiver Lookbehind](#43-positiver-lookbehind) + - [Negativer Lookbehind](#44-negativer-lookbehind) +- [Modifikatoren](#5-modifikatoren) + - [Schreibungsunabhängig i](#51-schreibungsunbhängig) + - [Globale Suche](#52-globale-suche) + - [Mehrzeilig](#53-mehrzeilig) +- [Gierige vs Faule Übereinstimmung](#6-gierige-vs-faule-übereinstimmung) + +## 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](https://regex101.com/r/dmRygT/1) + +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](https://regex101.com/r/1paXsy/1) + +## 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](https://regex101.com/r/xc9GkU/1) + +## 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](https://regex101.com/r/2ITLQ4/1) + +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](https://regex101.com/r/wL3xtE/1) + +### 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](https://regex101.com/r/nNNlq3/1) + +## 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 `a`s 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](https://regex101.com/r/7m8me5/1) + +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\*` 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](https://regex101.com/r/gGrwuz/1) + +### 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](https://regex101.com/r/Dzf9Aa/1) + +### 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](https://regex101.com/r/cIg9zm/1) + +
+"[T]?he" => The car is parked in the garage.
+
+ +[Teste den regulären Ausdruck](https://regex101.com/r/kPpO2x/1) + +## 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](https://regex101.com/r/juM86s/1) + +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](https://regex101.com/r/Gdy4w5/1) + +
+"[0-9]{3}" => The number was 9.9997 but we rounded it off to 10.0.
+
+ +[Teste den regulären Ausdruck](https://regex101.com/r/Sivu30/1) + +## 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](https://regex101.com/r/tUxrBG/1) + +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](https://regex101.com/r/Rm7Me8/1) + +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](#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](https://regex101.com/r/fBXyX0/1) + +## 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](#3-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](https://regex101.com/r/DOc5Nu/1) + +## 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](https://regex101.com/r/5ljjgB/1) + +
+"^(T|t)he" => The car is parked in the garage.
+
+ +[Teste den regulären Ausdruck](https://regex101.com/r/jXrKne/1) + +### 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](https://regex101.com/r/y4Au4D/1) + +
+"(at\.)$" => The fat cat. sat. on the mat.
+
+ +[Teste den regulären Ausdruck](https://regex101.com/r/t0AkOd/1) + +## 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. 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| +|? +"(T|t)he(?=\sfat)" => The fat cat sat on the mat. + + +[Teste den regulären Ausdruck](https://regex101.com/r/IDDARt/1) + +### 4.2 Negativer 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](https://regex101.com/r/V32Npg/1) + +### 4.3 Positiver 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](https://regex101.com/r/avH165/1) + +### 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 `(? +"(?<!(T|t)he\s)(cat)" => The cat sat on cat. + + +[Teste den regulären Ausdruck](https://regex101.com/r/8Efx5G/1) + +## 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 Schreibungsunabhängig + +Der `i` Modifikator wird benutzt, um schreibungsunbhängige Übereinstimmungen 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](https://regex101.com/r/dpQyf9/1) + +
+"/The/gi" => The fat cat sat on the mat.
+
+ +[Teste den regulären Ausdruck](https://regex101.com/r/ahfiuh/1) + +### 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](https://regex101.com/r/jnk6gM/1) + +
+"/.(at)/g" => The fat cat sat on the mat.
+
+ +[Teste den regulären Ausdruck](https://regex101.com/r/dO1nef/1) + +### 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](https://regex101.com/r/hoGMkP/1) + +
+"/.at(.)?$/gm" => The fat
+                  cat sat
+                  on the mat.
+
+ +[Teste den regulären Ausdruck](https://regex101.com/r/E88WE2/1) + +## 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](https://regex101.com/r/AyAdgJ/1) + +
+"/(.*?at)/" => The fat cat sat on the mat. 
+ + +[Teste den regulären Ausdruck](https://regex101.com/r/AyAdgJ/2) + +## Beitragen + +* Öffne pull requests mit Verbesserungen +* Diskutiere Ideen in issues +* Erzähl es anderen +* Gib Rückmeldung [![Twitter URL](https://img.shields.io/twitter/url/https/twitter.com/ziishaned.svg?style=social&label=Follow%20%40ziishaned)](https://twitter.com/ziishaned) + +## Lizenz + +MIT © [Zeeshan Ahmad](https://twitter.com/ziishaned)