Regex

Regex (oder RegeExp) ist die Abkürzung für regular expression und heisst übersetzt regulärer Ausdruck. Sie sind eine Art Sprache, die beim Programmieren für diverse Problemlösungen verwendet werden kann. Regex kann man einsetzen, um Zeichenketten (Strings) zu bearbeiten, zu validieren (prüfen) oder in ihnen etwas zu suchen. Die Texteditoren, wie z.B. die App “Editor” oder “Notepad++”, verarbeiten in der Funktion “Suchen und Ersetzen” auch regex. Sie können als Filterkriterien in der Textsuche verwendet werden. Das Muster des regex muss dafür mit dem Text abgeglichen werden. Diesen Vorgang nennt man auch Pattern Matching (englisch für Musterabgleich). Man sucht beispielsweise ein Wort, das mit einem Großbuchstaben beginnt, das Zeichen “a” enthält und mit “l” endet, ohne alle dazwischenliegende Buchstaben explizit vorzugeben. Mit regex geht das sehr einfach und effizient.

Anwendung

Mit regex kann man Zeichenketten auf eine bestimmte Zeichensetzung überprüfen, wie z.B. die Eingaben eines Benutzers in einer Applikation. Zum Beispiel muss die Eingabe der Schulnote, der Postleitzahl, der Telefonnummer oder des E-Mails auf falsche/ungültige Eingaben überprüft werden. Regex ist meistens bekannt durch dessen Auftreten in Web-Anwendungen (wie z.B. PHP) oder in Unix-Skripte. Man muss auch beachten, dass regex Case-Sensitive ist. Das bedeutet, dass die Groß- und Kleinschreibung nicht verwechselt werden sollten, da Beispielsweise \w eine andere Bedeutung hat als \W.

Guter Stil

Wenn man ein Problem lösen will, gibt es verschiedene Lösungen. Hier sind drei Arten von Lösungen:

  • Eine genaue Lösung und eine allgemeinere. Ist die Lösung viel zu restriktiv, sodass ein Benutzer möglicherweise frustriert wird und keine Lust mehr hat, weil seine Eingaben nicht akzeptiert werden, so ist eine allgemeinere Lösung besser. Wenn das Problem jedoch eindeutig ist, so nimmt man eine genauere Lösung.
  • Eine genaue Lösung und eine schnelle. Man muss auf die Länge der regulären Ausdrücke achten. Je länger sie ist, desto mehr Zeit braucht die Überprüfung und desto länger muss der Benutzer warten. Man muss hier die richtige Entscheidung treffen, die je nach Problem anders sein kann.
  • Eine einfache Lösung und eine “elegante”. Clean-code kennen wir alle. Man achtet darauf, wie man den Code schreibt, damit es auch für andere Entwickler verständlich ist und du später den Code immer noch verstehst und noch ändern kannst. Sowas gibt es auch in regex. Man kann sehr komplizierte Ausdrücke schreiben in sehr wenige Zeichen, jedoch besteht die Gefahr, dass sie nicht Verständlich ist und du es nicht mehr so leicht ändern kannst. Deshalb sollte man lieber die einfachere Variante nehmen und komplizierte Ausdrücke kommentieren.

 

Cheatsheet

Character classes
.

\w \d \s

\W \D \S

[abc]

[^abc]

[a-g]

Jedes Zeichen außer Zeilenumbruch

Wortzeichen, Zahl, Leerzeichen

nicht/ kein Wortzeichen, Zahl, Leerzeichen

Buchstabe a, b oder c

nicht/ kein a, b oder c

Buchstabe zwischen a & g

Anchors
^abc$

\b \B

Start / Ende der Zeichenkette (String)

Wortgrenze, nicht/ keine Wortgrenze

Escaped characters
\. \* \\

\t \n \r

speziale Escape-characters/ Sonderzeichen

Tab, Line Feed, Carriage Return

Groups & Lookaround
(abc)

\1

(?:abc)

(?=abc)

(?!abc)

Gruppierung Konstrukt

Rückwärtsreferenz zur Gruppe 1

Nicht erfassende Gruppen

Positive Lookaheadassertion

Negative Lookaheadassertion

Quantifiers & Alternation
a* a+ a?

a{5} a{2,}

a{1,3}

a+? a{2,}?

ab | cd

0 oder mehr, 1 oder mehr, 0 oder 1

genau 5, mindestens 2

zwischen 1 und 3

So wenige wie möglich abgleichen

Entweder ab oder cd

 

Beispiele

(0..1) ⇒ 0 oder 1

(0..*) ⇒ 0 oder mehr

(1..*) ⇒ 1 oder mehr

RegexMatch
hello my friend
hello my friend
hello\s+my\s+friend
hello + whitespace(1..*) + my + whitespace(1..*) + friend
^\d+(\.\d+)?
^ Pattern muss auf neue Zeile beginnen + Zahl(1..*) + Optionale Gruppe (0..1) → “.” + Zahl(1..*)
([A-Z])\w+
Großbuchstabe + Wortzeichen(1..*)


([0-9])*\.5


Zahl(0..*) + “ . “ + “ 5 “