RegEx |
Reguläre Ausdrücke (Regular Expession)
Ein regulärer Ausdruck stellt eine Zeichenkettenbeschreibung dar.
Pattern
/ pattern / i
Delimiter (Begrenzer): Das eigentliche Muster wird von sogenannten Delimitern am Anfang und am Ende begrenzt, damit für den Interpreter ersichtlich ist, wo das Muster anfängt und wo es aufhört. Jedes nicht-alphanumerische Zeichen ausser dem \ darf als Delimiter genutzt werden. Es ist also nicht zwingend nötig den / als Delimiter zu nutzen. Oft genutzt werden neben Schrägstrich auch das Prozentzeichen oder das Ausrufezeichen. Pattern: Dies ist das eigentlich Muster, das im weiteren Verlauf des Tutorials behandelt wird. Modifier: Nach dem abschließenden Delimiter können sogenannte Modifier angehängt werden
Modifier
An den abschließenden Delimiter sogenannte Modifier angehängt werden, welche das gesamte Suchmuster betreffen. So kann man z.B. durch anhängen eines i dafür sorgen, dass die Suche unabhängig von Groß-/Kleinschreibung funktioniert, was z.B. für Suchfunktionen in Datenbanken oder auf Homepages sehr vorteilhaft ist. Im folgenden eine Liste einiger Modifier und ihrer Funktion.
Pattern (Suchmuster)
Quantoren erlauben für ein oder mehrere Zeichen die Angabe der minimalen, maximalen oder exakten Anzahl dieser Zeichenfolge.
Wird kein Quantoren angegeben, so wird davon ausgegangen, dass das Zeichen einmal vorhanden sein muss.
Die eckigen Klammern umschließen eine Liste, einen Bereich von Zeichen oder beides. [abc] z.B. bedeutet jedes einzelne Zeichen, das a, b oder c ist. Ein Bindestrich (-) zwischen zwei Zeichen definiert einen Bereich. [a-z] z.B. bedeutet jedes einzelne Zeichen vom kleinen "a" bis zum kleinen "z"". Einer Zeichengruppe können *, ?, +, or {min,max} folgen.
[0-9]+ z.B. findet ein oder mehrere aufeinanderfolgende Vorkommen jeder Ziffer; deswegen findet es xyz123 aber nicht abcxyz. Listen und Bereiche können kombiniert werden. [a-zA-Z0-9_] z.B. bedeutet jedes einzelne Zeichen, das ein Buchstabe, eine Ziffer oder ein Unterstrich ist.
Weitere Bsps:
[a-f] Kleinbuchstaben von a bis f [abcxzy] die kleinen Buchstaben a, b,c , x,y und z sind gültig. Eine Zeichenklasse gibt eine Auswahl von erlaubten Zeichen an. Beispiel: /^a[xy]/ Dies trifft auf ax und ay zu. Zwar könnte man hier auch noch ohne weiteres mit einer normalen runden Klammer und einem | agieren, im folgenden Beispiel wird es allerdings evtl. schon deutlicher, wo der Vorteil von Charakterklassen liegt. Beispiel: /^a[0-9]/ Dieses Muster passt auf a0, a1, a2, ..., a9 und damit sollte der Vorteil von Charakterklassen endgültig klar sein. Gleichzeitig haben wir hier eines von zwei Sonderzeichen in einer Charakterklasse kennengelernt, nämlich den Bindestrich - . Der Bindestrich gibt, wie man es sich auch logischerweise denken könnte eine Reichweite an. Beispiel: /^[a-zA-Z]+/ nutzen. Wenn man nun noch bestimmte Sonderzeichen hinzufügen kann, so kann man diese einfach zusätzlich hineinschreiben. [0-9+-*\/] Würde also auf alle Zeichen eines einfachen Taschenrechners ansprechen. Dabei muss der / durch einen vorrangestellten \ maskiert werden, sofern ihr den / als Pattern-Delimiter nutzt. Das zweite Sonderzeichen in Charakterklassen ist der Zirkumflex ( ^ ). Dies ist wiederum ein etwas verwirrender Punkt, da der Zirkumflex ja eigentlich den Beginn der Zeichenkette markiert. In einer Charakterklasse hat ^ allerdings eine negierende (verneinende) Aufgabe. Beispiel: /^a[^bc]$/ Dieses Muster triff auf alle Zeichenketten zu, die ein a Anfang haben, ausser ab und ac. Dadurch können wir unseren Ausdruck nochmal kürzen:
[a-z]{3}
Quantoren sind von Natur aus gierig, d.h. sie nehmen so viel Platz ein wie nur möglich. Mit folgenden Ausdruck wollen wir einen HTML-Tag f inden: <.+> Soweit so gut. Nehmen wir ein Beispiel: <h1><font color=#0000FF>proggen.org</font></h1> Zuerst könnte man annehmen wir bekommen folgende Matches: <h1> <font color=#0000FF> </font> </h1> Wenn wir aber bedenken, dass der Quantor '+' so viel Platz wie nur möglich in Anspruch nimmt, merken wir, dass wir nur einen einzigen Match haben: <h1><font color=#0000FF>proggen.org</font></h1> Ja, '+' beschlagnahmt kompletten Text vom ersten '<' bis zum letzten '>'. Dieses Verhalten können wir ändern, indem wir ein Fragezeichen nach einem Quantor schreiben: <.+?> Führt zur erwarteten Ausgabe.
Gruppen
Zeichenketten und -klassen können auch zu einer Gruppe zusammengefassen werden. Dazu wir einfach der Ausdruck zwischen runde Klammern gesetzt: ([pP]erl)
Damit haben wir bereits eine einfache Gruppe erstellt. Im nachfolgenden Teil des regulären Ausdrucks können wir uns jetzt wieder mit einer Rück-Referenz auf diese Gruppe beziehen. Um sich auf eine Gruppe zu beziehen wird entweder
<(.+?)>(.*)</\g{1}>
<(.+?)>(.*)</\g{-2}>
<(.+?)>(.*)</\1> Gruppen kann man auch Namen geben, über den sie später schnell wieder gefunden werden kann: <(?<Tag>.+?)>(.*)</\k<Tag>>
Wie im Beispiel demonstriert erfolgt Zuweisung über (Perl|Python) gefällt mir (sehr gut|nicht). Dieses Muster passt auf folgende Texte: Perl gefällt mir sehr gut. Python gefällt mir sehr gut. Perl gefällt mir nicht. Python gefällt mir nicht.
Backreferences Backreferences sind, wie die Übersetzung schon sagt, Rückbezüge. Und zwar sind es Rückbezüge, die sich auf einen vorangegangenen Teil des Patterns (in runden Klammern) bezieht und den Inhalt dieser (Klammer) enthält. Dazu gibt es generell zwei verschiedene Arten der Syntax. Die neuere davon ist $n, die ältere \\n, wobei n für die n-te Klammerngruppe steht. Beispiel: !(<b>|<i>>)(.*?)(</$1>)! Dieses Muster trifft also auf <b>test</b> aber auch <i>test</i>, nicht aber auf <b>test</i> zu.
http://www.tutorials.de/php-tutorials/142738-regulaere-ausdruecke-regular-expressions-regex.html
http://www.ag-intra.net/linux-al-regex.html
http://www.proggen.org/doku.php?id=regex:start#einleitung
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||