Mustererkennung für alphanumerische Zeichen

PHP - Regex (Reguläre Ausdrücke)

Mustererkennung einfach erklärt!

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.

Was sind Reguläre Ausdrücke?

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}/

Reguläre Ausdrücke in Programmiersprachen wie PHP

In vielen Programmiersprachen ist die Auswertung und Verarbeitung von Regulären Ausdrücken bereits integriert. In der bekannten Programmiersprache PHP, in denen auch viele Webapplikationen bei Christian John Softwareeentwicklung erstellt wurden, werden häufig folgende Funktionen zur Verarbeitung von regulären Ausdrücken genutzt:

preg_filter - Sucht und ersetzt mit regulären Ausdrücke in einem Text
preg_grep - Liefert Array-Elemente, die auf ein Suchmuster passen
preg_match_all - Führt eine umfassende Suche nach Übereinstimmungen mit regulärem Ausdruck durch
preg_match - Führt eine Suche mit einem regulären Ausdruck durch
preg_replace - Sucht und ersetzt mit regulären Ausdrücken
preg_split - Zerlegt eine Zeichenkette anhand eines regulären Ausdrucks

Aufbau, Zeichenklassen, Operatoren

Der Aufbau der Regulären Ausdrücke ist eine Aneinanderreihung bestimmter Zeichenklassen und Operatoren, wie eine mathematische Rechenformel. Wichtig ist, dass um das Muster herum, also am Anfang und am Ende ein identisches Zeichen steht, das kein alphanumerisches Zeichen oder der Backslash ist. Häufig wird ein Slash "/" oder eine Raute ""# verwendet.

Wichtige Zeichenklassen:

[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

Operatoren

^
^
$
|
[]
()
(?:)
(?=)
(?!)
\A am Anfang
\z am Ende

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

Zeichenanzahl / Häufigkeiten

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}
[a-z]{x,}
[a-z]{,x}
[a-z]{x,y}
[a-z]+
[a-z]*
[a-z]?

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


Modifier

Modifier beeinflussen das Erkennungsverhalten bei Regulären Ausdrücken. Sie stehen am Ende (sogar nach dem "/") des regulären Ausdrucks und können beliebig kombiniert werden. An dieser Stelle sollen nur zwei Modifier genannt werden, die häufig verwendet werden:
i = Keine Unterscheidung zwischen Groß- und Kleinschreibung
s = Alle Zeichen inkl. Zeichenümbrüche entsprechen dem Punkt-Operator

Sonderzeichen

Möchte man Sonderzeichen wie eine Klammer als Erkennungszeichen verwenden (normalerweise Gruppierung), muss dieses mit einem vorangehenden Backslash gekennzeichnet werden.
Dies gilt für die folgenden Zeichen: ( ) { } [ ] | / + ? * . ^ & -
Beispiel:
(+49) erkennt "(+49)" 
(+49) ist ein Fehlerhafter Ausdruck, da das Plus nicht hinter einer Zeichenklasse steht. Ohne Plus würde lediglich 49 erkannt werden.

Regex Beispiele und Fazit

(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

Reguläre Ausrücke sind ein mächtiges Regelwerk zur Beschreibung und Erkennung von Text-Mustern. Die Ausdrücke sind logisch aufgebaut, müssen jedoch zum Verständnis auf Grund verschiedener Schachtelungen genau gelesen werden.

Wer etwas Inspiration sucht, der findet hier einen Tester für Reguläre Ausdrücke: www.regex101.com