PHP - Regex (Reguläre Ausdrücke)
Aus meiner Zeit als Tutor für Modelle der Informatik an der Universität Essen weiß ich, dass Reguläre Ausdrücke schnell zu einer Hürde im Lern- und Programmierfortschritt werden. Dabei sind Reguläre Ausdrücke ein wichtiges Hilfsmittel bei der Programmierung, um Texte und Eingabe zu validieren oder zu durchsuchen.
Aus diesem Grund möchte ich in diesem Artikel die Grundlagen von Regulären Ausdrücken anschaulich und praktisch erklären.
Ziel ist es, zu verstehen, was Reguläre Ausdrücke sind, wie sie funktionieren und wie man sie anwendet.
Reguläre Ausdrücke sind eine algebraische Variante zur Definition von (Text-)Mustern. Man kann sie sich wie eine mathematische Formel vorstellen, mit der man Textmuster beschreiben kann.
Was das bedeutet, möchte ich an einem Beispiel verdeutlichen:
Nehmen wir an, wir wollen eine deutsche Handy-Nummer beschreiben und erklären, wie diese aufgebaut ist.
Das Textmuster für eine Handynummer lautet:
Beginnt immer mit einer Null und einer Eins.
Dann folgt entweder einer Fünf, Sechs oder Sieben.
Anschließend folgenden 7-9 unterschiedliche Zahlen.
Und wozu bedarf es jetzt der regulären Ausdrücke?
Möchte man zum Beispiel mit einem Computer-Programm prüfen, ob eine Eingabe eine gültige Handynummer ist, kann man dies über Schleifen machen. Innerhalb der Schleifen wird jedes einzelne Zeichen der Eingabe verarbeitet und nach den Kriteriun oben geprüft. Ist das erste Zeichen eine Null, ist das zweite Zeichen eine Eins, ist das Dritte Zeichen eine Fünf, Sechs oder Sieben, usw...
Das ist bei einfachen Mustern machbar, bei komplexen Zeichenketten wird es jedoch schnell unübersichtlich. Mit Regulären Ausdrücken kann man in vielen Programmiersprachen das bechriebene Text-Muster in eine Computer-Verständliche mathematische Form bringen. Der Computer kann dann prüfen, ob beispielsweise das Muster auf eine Eingabe passt oder nicht.
Für das obige Beispiel wäre ein regulärer Ausdruck wie wir ihn oben beschrieben haben:
/01(5|6|7)(0-9){7,9}/
[a-z] [b-m] [A-Z] [0-9] alternativ \d [a-zA-Z0-9_] oder \w [\r\n\t\f] alternativ \s . = Punkt \b |
Alle Kleinbuchstaben Kleinbuchstaben von b bis m Alle Großbuchstaben Alle Zahlen Alle alphanumerischen Zeichen und der Unterstrich Alle Steuerzeichen wie Zeilenumbruch, Tabulator Alle Zeichen ohne neue Zeile \n Wortgrenze wie Leerzeichen oder Tabulator |
^ |
Wenn ^ erstes Zeichen ist, dann muss die Zeichenketten mit der Regel beginnen Wenn ^ nicht erstes Zeichen, dann ist dies die Negierung (z.B. [^0-9] = Keine Zahl) Wenn $ das letztes Zeichen ist, dann muss der String mit der Regel enden Alternative eines der Zeichen innerhalb der Klammern muss vorhanden sein Gruppierung mit Selektion in Variable Grupperierung ohne Selektion Ausdruck vor der Klammer muss gefolgt werden von Ausdruck in Klammer Zeichenkette vor der Klammer darf nicht von Zeichenkette in der Klammer gefolgt werden Regex muss mit Zeichen hinter \A beginnen Regex muss mit Zeichen vor \z enden |
Auch über reguläre Ausdrücke lassen sich die Häufigkeiten von Zeichen definieren. Im Beispiel oben konnte man bereits erahnen, das die Werte in den geschwungenen Klammern ({7,9}) für die Zeichenanzahl stehen könnten.
[a-z]{x} |
Ein Kleinbuchstabe muss genau x mal auftauchen Ein Kleinbuchstabe muss mindestens x bis unendlich mal vorkommen Ein Kleinbuchstabe darf maximal x mal auftauchen Ein Kleinbuchstabe muss mindestens x und maxmial x mal vorkommen Ein Kleinbuchstabe muss mindestens einmal vorkommen, wie {1,} Ein Kleinbuchstabe kann beliebig oft vorkommen, auch 0 mal, wie {0,} Ein Kleinbuchstabe kann, muss aber nicht vorkommen, wie {0,1} |
Wichtiger Hinweis:
Sind vor der Häufigkeitsangabe eine Menge von Zeichen ausgewählt, kann daraus beliebig gewählt werden. Ist die Häufigkeit größer eins, so kann bei einer Zeichenmenge jedes mal neu aus dieser Menge gewählt werden.
Beispiel: [a-z]{5} => gültig sind unter anderem aaaaa oder abcde oder asdfg
(jpeg|jpg|gif) | Erkenne "gif", "jpg" und "jpeg" |
[^A-Za-z0-9] | Keine Buchstaben oder Zahlen => Ein Symbol |
([A-Z]{2}|[0-9]{4}) | Erkenne 2 Buchstaben oder 4 Zahlen |
(?<=0)\d{5}(?=0) | Erkenne alle 5-Stelligen Zahlen ohne Null, die zwischen Nullen stehen |
(0|1)*01 | Beliebige Kombination aus Nullen und Einsen, die auf 01 enden |
(AUDI (A4|Q5)|BMW (Mini, Z3)) | Welches Auto fahren Sie? |
^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$ | Email-Adresse |