Du hast deinen AdBlocker an?

Es wäre ein Traum, wenn du ihn für t3n.de deaktivierst. Wir zeigen dir gerne, wie das geht. Und natürlich erklären wir dir auch, warum uns das so wichtig ist. Digitales High-five, deine t3n-Redaktion

Entwicklung & Design

Bis das Gehirn blutet: Der Regex-Guide von t3n

Regular Expressions. (Foto: Flickr/Jeff KubinaCC BY-SA 2.0)

Regex erinnert an Kraftausdrücke in Comics – und die meisten Webworker werden bei Regex auch fluchen müssen. Dabei sind die Regulären Ausdrücke nicht schwer zu erlernen, als Webworker muss man nur wissen, was möglich ist – denn die einzelnen Befehle könnt ihr jetzt hier nachlesen.

Regex ist die Sprache, die Sprachen bändigt – und die Entwickler manchmal zum Weinen bringt. Trotzdem kommt man um sie nicht herum, denn Reguläre Ausdrücke könnt ihr immer dann einsetzen, wenn ihr nach einem gewissen Muster in Zeichenketten beziehungsweise Texten (zum Beispiel Substrings) sucht oder ihr Text modifzieren wollt. Das Herausfiltern von Beistrichen oder das Finden von Postleitzahlen und Telefonnummern in einer Textdatei mit mehreren 1.000 Einträgen wird so quasi zum Kinderspiel – vorausgesetzt, ihr beherrscht die Regulären Ausdrücke.

Wir haben schon einen einleitenden Artikel zu Regex veröffentlicht, in dem ihr unter anderem auch Ressourcen findet, die euch beim Erlernen von Regex helfen sollen. Die Regulären Ausdrücke sind selbst eine Aneinanderreihung von Zeichen, bei deren Anzahl es technisch keine Begrenzung gibt. In der Regel sollten Regex-Anweisungen aber kurz gehalten werden, damit die ohnehin schwer zu lesende Sprache nicht noch unverständlicher wird. Dabei könnt ihr euch die Regex-Anweisung als kleines Programm vorstellen, das in Regex geschrieben wurde – wobei der Umfang der Syntax recht klein und domain-spezifisch ist. Daher ist es möglich, dass ihr mit Regex auch If/Then/That-Anweisungen umsetzt. Wobei ihr natürlich auf korrekte Syntax und die spezifischen Eigenarten von Regex achten müsst – aber dazu mehr in diesem Guide.

Regex: tl;dr

Die folgende Liste soll als kurze Referenz dienen, damit ihr schnell den ein oder anderen Befehl nachschauen könnt. Die einzelnen Befehle werden im Laufe des Guides genauer erklärt:

Literale: a b c d e f 1 2 3 4 5 6 etc. Metacharacters: . \ [ ] { } ? * + | ( ) ^ $ Zahl: \d Alphanumerischer Character: \w Whitespace (Leertasten, Tabulatoren, „Carriage-Return“ und „Line-Feeds“): \s Negiert die Character-Klassen: \D, \W, \S, [^abc] Character: . Multiplier: {42}, {4,20} Eins oder mehr: + Null oder Eins: ? Null oder mehrere: * Grouping/Alternation: (Mon|Diens)tag Wort- und Text-Boundaries: \b ^ $ Escape: \

In die Höhle des Löwen: Die Regulären Ausdrücke

Die Regulären Ausdrücke setzen sich aus Literalen und „Metacharacters“ zusammen. Der Unterschied liegt dabei darin, dass die „Metacharacters“ nicht dazu genutzt werden, die Zeichen darzustellen, die gefunden werden sollen, sondern um bestimmte Anweisungen durchzuführen – daher besitzen sie eine spezielle Bedeutung.

Regex: Das Literal

Die meisten Zeichen (a b c d e et cetera und Zahlen wie 1 2 3 4 5 6 et cetera) sind Literale, sie finden sich also selbst. Wenn ihr also nach t3n sucht, dann bedeutet das: „Finde t, gefolgt von einer 3, gefolgt von einem n.

Metacharacter in Regex

Wie bereits angesprochen gibt es einige Zeichen (. \ [ ] { } ? * + | ( ) ^ $), die spezielle Fähigkeiten oder Eigenschaften aufweisen. Diese werden als Metacharacter bezeichnet, wobei nicht alle in einer Charakter-Klasse verwendet werden können, aber dazu später mehr.

.

Der Punkt beziehungsweise „Fullstop“ oder „Dot“ findet ein Zeichen. Der reguläre Ausdruck t.n bedeutet: „Finde das Zeichen t gefolgt von einem beliebigen Zeichen und einem abschließenden n.“ Damit finden wir t3n, aber auch ten oder tnn. Wir bekommen aber nicht t33n oder tn zurück. Anders verhält es sich mit Leertasten. Der reguläre Ausdruck t n bedeutet: „Finde t gefolgt von einer Leertaste, gefolgt von einem n.

Aber was ist, wenn ihr etwas finden wollt und der . soll nicht als Anweisung, sondern als Literal erkannt werden? Die Antwort heißt: „Escape“. Ihr könnt „Metacharacters“ zu Literalen umwandeln, indem ihr vor dem Zeichen einen \ setzt. Der reguläre Ausdruck t\.n bedeutet: „Finde t gefolgt von . gefolgt von n. Und da \ selbst auch zu den „Metacharacters“ zählt, könnt ihr auch diesen „escapen“: t\\n.

„Character class range“

Angenommen, ihr wollt ein Literal einer gewissen Menge aus dem Alphabet suchen, dann könnt ihr [a b c d e f] et cetera verwenden. Um das aber zu verkürzen, könnt ihr in Regulären Ausdrücken auch eine „Range“ angeben. Das letzte Beispiel als „Range“ angegeben sieht so aus: [a-f]. Dieses Regex bedeutet nichts anderes als: „Finde eines der Zeichen aus [a b c d e f]“. Ihr könnt zwischen [A-Z], [a-z], [1-9] oder Teilmengen davon unterscheiden. Der Bindestrich hat außerhalb der „Character class range“ keine spezielle Bedeutung, somit gibt a-z einfach nur ein a gefolgt von einem Bindestricht gefolgt von einem z zurück.

Dabei ist zu beachten, dass „Ranges“ zusammen mit isolierten Zeichen zusammen funktionieren können: [0-9.,] gibt euch eine Zahl oder . oder , zurück. Wichtig: „Ranges“ funktionieren nur für Zeichen, nicht aber für Ziffern beziehungsweise Zahlen. Der reguläre Ausdruck [1-21] bedeutet nicht: „Finde Ziffern von 1 bis 21“ sondern „Finde die Ziffern 1 oder 2 oder 1.

„Character class negation“

Aber Regex kann nicht nur finden, sondern auch nicht finden – also negieren. Wenn ihr also nach einem Zeichen sucht, das nicht t sein soll, dann lautet der Ausdruck dafür: [^t]

Bitte beachte unsere Community-Richtlinien

17 Reaktionen
Sebastian Düvel

Für den Mac gibt es die nette App Patterns: http://krillapps.com/patterns/
Da kann man die RegExs direkt ausprobieren und sieht was sie bewirken.

Agentur

Wieso geht hier niemand auf marvins berechtigten Kommentar ein?
Bitte tauscht das Bild aus, es ist nicht ersichtlich, was es da zu suchen hat!

Florian Blaschke

Liebe Anne. Wir wollen das gar runterspielen, auch wenn für viele hier der Sexismus in dem Artikelbild wohl nicht ersichtlich war. Aber wenn das bei Dir anders ist, tut uns das leid, dann waren wir da wohl nicht sensibel genug. Als Argument zumindest genügt das, das Bild auszutauschen. Viele Grüße aus dem HQ!

Axel

Ich bin beim Lesen über die folgende Stelle gestolpert:
"Dabei ist zu beachten, dass t{10} das gleiche ist wie t{10,10} und dass der Ausdruck t{1,4} bedeutet: „Finde ein tttt gefolgt von ttt, gefolgt von tt, gefolgt von t“."

Im ersten Augenblick dachte ich, wieso soll t{1,4} das gleiche sein wie t{10}:
Finde "tttt" gefolgt von "ttt", gefolgt von "tt", gefolgt von "t" heißt ja nichts anderes als finde "tttttttttt" ('tttt'+'ttt'+'tt'+'t' *). Und somit wäre der Ausdruck t{1,4} der Erklärung nach mit t{10} (bzw. t{10,10}) identisch.

Müsste man zur Erklärung dann nicht eher folgendes sagen:
t{1,4} heißt: Finde "tttt" oder "ttt" oder "tt" oder "t"

*) PHP-Experten dürfen gerne die "+"-Zeichen durch einen Punkt (.) ersetzen ;-)

Lars

Uff, Deinen mittleren Absatz kann ich nicht nachvollziehen, vermute aber, dass Du die Validierungsreihenfolge bzw. Erfüllungsreihenfolge eines Quantifiers meinst.

t{1,4} ist nämlich nicht gleich t{10} und auch nicht t{10,}

Der Artikel verschweigt an der Stelle leider die vollständige Funktion des "?"
Ein Fragezeichen hinter einem Quantifier, also einer Mengenangabe von Zeichen lässt die Erfüllung der Bedingung "geizig" werden. Uff ist das kompliziert. ;-)
Vorausgesetzt man hat die Quantifier verstanden erkläre ich mal so:
String: xtttyyy
xt+ ist identisch mit xt{1,} es findet x gefolgt von mindestens einem t
Er würde xttt matchen.
xt{1} ist identisch mit xt{1}? und macht absolut keinen Sinn.
Es matched xt.
Interssant wird es erst bei:
xt{1,3} bzw. xt{1,3}?
Während der erste die maximale Anzahl an "t" zu kassieren ist der zweite Ausdruck geizig und gibt sich mit der geringsten Menge zufrieden.

Freebie Multiplier, muss ich gestehen, habe ich nicht verstanden. Für mich gehört das ? ebenfalls in die Kategorie Quantifier.
? = 0 oder 1
+ = 1 oder mehr
* = 0 oder mehr
und bezieht sich immer auf die vorangegangene Gruppe, Klasse, Zeichen oder Muster.
Der ? hinter einem Quantifier also +? *? oder {1,...}? lässt den Quantifier geizig beim sammeln werden.

Ich habe meine Regulären Ausdrücke gerne immer mit dem Regex Coach geschrieben. M.E. das stabilste und einfachste Werkzeug um nen regulären Ausdruck zu "schmieden". http://www.weitz.de/regex-coach/

GrundwissenIstDas

Das ganze hat nichts mit Nerd zu tun, daß ganze ist einfach nur eine Grundvoraussätzung für 2 Berufe (Entwickler / Admin).
Wer dies nicht beherrscht ist kein Entwickler oder Admin.
Ich würde mal sagen: "Möchte gern etwas von dem".
---
Nur weil nen Koch schneller seine Zwiebeln schneller schneidet oder blind weiss wann was fertig ist, ist er auch kein Nerd.
---

Torsten Fleischer | Personal Trainer Berlin

Guten Morgen.

Spannender Artikel und interessanter Input bzw. spannende Gedanken.

Danke für!.

Grüße.

Christian

"Ich lerne regex immer wieder neu wenn ich sie brauche ;)"

Geht mir genauso. Das 'Problem' an RegEx ist doch eigentlich, das man es viel zu selten benötigt/anwendet, als das es sich lohnt es wirklich auswendig zu lernen.

OT: Ist es eigentlich schlimm, wenn man erst mit dem Lesen dieses Artikels merkt, das t3n L33tspeak für Ten ist? (Ich lese t3n erst seit ein paar Monaten)

Lars Budde

Nein, das ist nicht schlimm. Es ist aber falsch. ;)

Der Name „t3n“ stammt aus alten Zeiten. Damals stand t3n für „Typo 3 News“.

Felix

"Most people, when confronted with a problem, think: 'I know, I'll use regular expressions!' Now they have two problems."

Sebastian Maier

Ich will mal eine Lanze für RegEx brechen, die sind ein super Hilfsmittel und auch nicht schwerer zu erlernen als manche Programmiersprache.

Und mit den vielen Testtools, die es gibt, auch für Einsteiger gut nutzbar.
Ich verwende ganz gerne Patterns auf OSX

Björn Dorra

Der pure Nerd-faktor – Regex-Ausdrücke visualisieren:

atom.io/packages/regex-railroad-diagram

- Björn Dorra, Founder http://netzaktiv.de

Mario Janschitz

Danke für den Tipp, das ist wirklich nützlich! Schade, dass es das Tool nur für Atom gibt -- obwohl ich ja kurz auf Sublime Text gehofft hatte :)

Sebastian Düvel

Gibt's auch ähnlich im Browser: http://www.regexper.com

Donngal

Ich lerne regex immer wieder neu wenn ich sie brauche ;)

Irgendwie ist das wie mit purem SQL. Eigentlich kann ich es , aber zur Sicherheit schlag ich immer nochmal nach.

Thomas

Es wird aber auch nur noch gemeckert in den Comments ;D
Nehmts mal ein bischen lockerer.

marvin

Durchlebt der Autor noch seine Pubertät oder weshalb hält er es für witzig genug, Brüste als Titelbild fürn Artikel über Regex zu wählen?

Du musst angemeldet sein, um einen Kommentar schreiben zu können.

Jetzt anmelden

Finde einen Job, den du liebst