Wenn Entwickler fluchen: Die besten Ressourcen für den Regex-Einstieg
Wer sich mit den regulären Ausdrücken (kurz: Regex) schon mal beschäftigt hat, ist unter Umständen auf das folgendes Zitat gestoßen:
Some people, when confronted with a problem, think „I know, I’ll use regular expressions.“ Now they have two problems.Jamie Zawinski
Wahrscheinlich gibt es selten ein Zitat, das derart zutrifft wie dieses. Und in diesem Artikel lest ihr, wie ihr das hier angesprochene „zweite Problem“ lösen könnt – indem wir euch gute Quellen zum Nachlesen und selbst ausprobieren zeigen. Doch zuerst zur Frage: Was sind Regex eigentlich?
Regex: Die Sprache, die Sprachen bändigt
Mit regulären Ausdrücken könnt ihr aus einer Menge von Zeichen durch die Angabe eines Musters gewisse Zeichen auswählen. So ist es beispielsweise möglich, dass ihr euch alle Leerzeichen in einem Absatz auswählt oder alle Wörter, die mit einem bestimmten Buchstaben beginnen. Dabei ist Regex kein „Suchen und Ersetzen“ im eigentlichen Sinne – kann in einigen Editoren aber dafür benutzt werden – sondern viel mehr die Möglichkeit ein wiederverwendbares Muster zu beschreiben mit dem ihr schnell und effizient mit Zeichen oder Zeichenketten interagieren könnt.
Bei Regex geht es darum, Muster zu beschreiben, die dann wie ein Filter auf einzelne Zeichen oder Zeichenketten wirken. Den gesamten Umfang von Regex innerhalb eines Artikels zu beschreiben, würde definitiv den Rahmen sprengen – wir werden aber einen Regex-Guide für euch nachliefern.
Ihr müsst herausfinden ob ein String eine E-Mail-Adresse ist? Mit regulären Ausdrücke könnt ihr das. Die Frage, die ihr euch stellen müsst, ist: Wie erkennt man eine E-Mail-Adresse, die man noch nicht kennt? Es dreht sich also alles um eine Definition des zu Suchenden.
[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@
(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|edu|gov|mil|
biz|info|mobi|name|aero|asia|jobs|museum)\b
Dieser Code würde euch E-Mail-Adressen liefern, allerdings muss er aktualisiert werden, sobald neue TLDs vorgestellt und eingeführt wurden. Wobei gesagt werden muss, dass Aufgrund der Komplexität von E-Mail-Adressen, Regex nicht geeignet ist, um eine zuverlässige Validierung durchzuführen. Das obige Beispiel zeigt euch nur, wie ihr ein Muster aus einem String herausfiltern könnt – wie ihr eure Ausdrücke aber dann letztendlich nutzt bleibt euch überlassen.
Regex muss aber nicht immer so kompliziert sein, denn schon die Möglichkeit, alle Zahlen, Kommata oder Strichpunkte zu finden, kann hilfreich sein. In diesem Fall würde der reguläre Ausdruck so aussehen: [0-9,;]+
Ressourcen zu Regex
Mit RegExr könnt ihr schnell und einfach sehr viel über Regex lernen. Das Beste daran: Ihr könnt eure Expressions live testen. Seit dem wir das letzte mal über Regex und RegExr berichtet haben, hat sich das Tool massiv verbessert. Für die Puristen kann ich Regular-Expressions.com empfehlen. Auf dieser Website findet ihr so ziemlich alles, was ihr über Regex wissen müsst. Die nachstehende Liste führt euch zu diversen Tutorials, die euch helfen können, besser mit Regex umzugehen:
- regexone.com
- regex.learncodethehardway.org
- Das Buch zu learncodethehardway.org
- Lea Verou erklärt Regex
- Firefox-Plugin um Regex zu testen
Im nachfolgenden Guide zu Regex werde ich tiefer auf die regulären Ausdrücke, ihre Metacharacters, Multipliers, die Literale et cetera eingehen.
Kennt ihr noch andere Tutorials, Ressourcen oder Bücher?
Auch en sehr schönes Online-Tool um Regex Expressions zu testen:
http://rubular.com
– Björn Dorra, Founder http://netzaktiv.de
Oje, das Thema ruft bestimmt bei vielen Informatikern ungute Gefühle in der Magengegend hervor, die im Grundstudium von den Profs mit regulären Ausdrücken, regulären Mengen, regulären Sprachen, rechtslinearer Grammatik, Chomsky-Hierachie etc. gequält worden sind. ;-)
Oh ja, da kommen wirklich ungute Gefühle in mir hoch :) glücklicherweise findet sich zu so gut wie jedem Regex Problem auch schon eine copy&paste Lösung im Netz.
Auch en sehr schönes Online-Tool um Regex Expressions zu testen:
rubular.com
— Björn Dorra, Founder http://netzaktiv.de
Hiermit kann man sich Regular Expressions zusammenklicken:
http://txt2re.com/
Sehr zu empfehlen, ich kann nicht mehr ohne :)
Reguläre Ausdrücke ist mit das Beste, was mir in einer Programmiersprache passiert ist. Selbst mit den Grundlagen kommt man schon ziemlich weit und steht erst einmal ziemlich hilflos da, wenn er mal wieder zu einer Programmiersprache ohne Regex greifen muss.
Aber Ihre wunderbaren Beispiele schrecken jeden Anfänger ab. Das „einfache“ Beispiel ^[0-9,;]+$ trifft nur bei Zeichenketten zu, die ausschließlich die genannten Zeichen enthalten (^Anfang und Ende$). Um su prüfen ob EINE Ziffern- und Strichpunktfolge in der Zeichenkette zu finden ist, wäre [0-9,;]+ die Wahl, um ALLE Folgen z.B. mit Perl zu finden, braucht man eine (g)lobale Suche mit Modifier:
@fundliste = $string=~/[0-9,;]+/g
Das Email Beispiel ist auch nicht vollständig, wer sich von der kompletten Regex abschrecken lassen will, der schaue hier:
http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html
Herauszufinden, ob ein String eine Email-Addresse ist, ist nicht trivial… und schon gar nicht mit regulären Ausdrücken. Das liegt u.a. daran, dass es erstaunlich viele Sonderfälle gibt, die für eine valide Email-Addresse eigentlich zugelassen sind (siehe auch http://stackoverflow.com/a/201378).
Im Allgemeinen ist es einfach keine gute Idee, zu versuchen, alle Email-Addressen nur per regulärem Ausdruck zu validieren, da reguläre Ausdrücke bei steigender Komplexität aufwändig zu debuggen und warten sind. Zusätzlich sollte einfach überprüft werden, ob die Email-Addresse tatsächlich existiert und demjenigen gehört, der diese verwendet, indem eine Bestätigungs-Email versendet wird.
Vermutlich wurden die Informationen in diesem Artikel zum Teil hier gefunden: http://www.regular-expressions.info/email.html
Hallo @JBraun
Von der Verwendung, der von dir verlinkten Methode aus RFC 822, wird — genauso wie bei RFC 5322 — abgeraten. Das von mir gewählte Beispiel erkennt zwar E-Mail-Adressen, dient aber nur als Beispiel wie man Muster eines Strings erkennen kann und nicht als best practice. Denn, E-Mail-Adressen abzufragen, ist absolut nicht trivial und sollte daher nicht über Regex gemacht werden. Ich habe den Absatz dementsprechend angepasst um Missverständnisse vorzubeugen. Code sollte aber ohnehin nicht kopiert werden, ohne zu wissen was er bedeutet.
Danke für den Hinweis, ich habe die line boundaries entfernt.
Herrje. Wer mit „sed“ und „ex“ gearbeitet hat, für den ist das dich kein großes Thema. :-)
Meine Links dazu: https://delicious.com/marviva/regexp
@Martin Bless Danke für deine Links!
Hier eine Webseite die verschiedene Tools zur Erstellung und Bearbeitung von Regex bietet http://www.regexmagic.com/
Ansich ja kein schlechter Artikel aber was mir fehlt ist eine gute deutschsprachige Quelle. Es ist zwar wahr, dass man als Programmierer auch englisch können sollte/muss. Das muss allerdings nicht bedeuten, dass man keine deutschen Quellen verwenden dürfte. Da der Artikel deutsch ist sollten auch weiterführende Infos in deutsch verfügbar sein. Wäre sehr nett wenn jemand was ergänzen könnte.
@Bernhard Lipp, manchmal ist Wiki dein Freund. Abgesehen von der umfangreichen Übersicht unter „Reguläre Ausdrücke in der Praxis“ findet sich dort ein Link auf einen Einführungskurs auf Deutsch:
http://www.regenechsen.de/phpwcms/index.php?regex_allg