Reguläre Ausdrücke – IT-Berufe-Podcast #160

Um reguläre Ausdrücke – das Schweizer Taschenmesser für ITler – geht es in der einhundertsechzigsten Episode des IT-Berufe-Podcasts.

TL;DR

Ich arbeite fast täglich mit regulären Ausdrücken, um Texte nach Mustern zu durchsuchen und gefundene Inhalte zu verändern. Mit wenigen Grundbausteinen kannst du beispielsweise E-Mail-Adressen herausfiltern oder Vor- und Nachnamen vertauschen. Als IT-Azubi kannst du diese Kenntnisse in vielen Editoren und auf der Kommandozeile einsetzen. Für beliebige HTML- und XML-Dokumente brauchst du einen passenden Parser; bei Anwendungen mit hohen Anforderungen an die Laufzeit solltest du den Rechenaufwand regulärer Ausdrücke beachten.

Kapitelmarken

  • [00:00:01] Einstieg: Reguläre Ausdrücke im IT-Alltag
  • [00:00:49] Was reguläre Ausdrücke leisten
  • [00:03:04] Die Syntax verstehen und mit Websites ausprobieren
  • [00:06:13] Muster beschreiben und Zeichen getrennt von ihrer Anzahl festlegen
  • [00:09:35] Unterschiedliche Schreibweisen von Meier suchen
  • [00:10:50] E-Mail-Adressen aus Dateien herausfiltern
  • [00:12:03] Einsatz in Systemintegration und beim Bearbeiten von Listen
  • [00:13:06] Wörtlich suchen und Sonderzeichen escapen
  • [00:14:40] Erlaubte Zeichen und Grenzen des E-Mail-Beispiels
  • [00:18:12] Zeichenbereiche mit eckigen Klammern bilden
  • [00:20:30] Zeichenbereiche negieren
  • [00:22:01] Zeilenanfang und Zeilenende erkennen
  • [00:24:15] Der Punkt als Platzhalter
  • [00:25:19] Quantifizierer und genaue Anzahlen
  • [00:28:53] Ein vereinfachtes Suchmuster für E-Mail-Adressen
  • [00:31:16] Alternativen mit der Pipe verbinden
  • [00:33:03] Gruppen bilden und Inhalte beim Ersetzen wiederverwenden
  • [00:36:40] Die wichtigsten Syntaxbausteine im Überblick
  • [00:38:41] Praxisbeispiel: UUIDs herausfiltern
  • [00:40:28] E-Mail-Adressen suchen und Namen vertauschen
  • [00:41:33] Leerzeichen am Zeilenende entfernen
  • [00:42:07] Markdown-Aufzählungszeichen einfügen
  • [00:43:47] Felder für Klassen vorbereiten und im Blockmodus bearbeiten
  • [00:45:54] Links zwischen HTML und Markdown umschreiben
  • [00:47:29] Grenzen beim Verarbeiten von HTML und XML
  • [00:49:17] Rechenaufwand und der Ausfall von Stack Overflow
  • [00:50:37] Reguläre Ausdrücke in Shells, Editoren und IDEs
  • [00:51:51] Literaturempfehlung und Websites zum Lernen
  • [00:53:14] Feedback und Abschied

Probeabo bei Audible (Affiliate)

Inhalt

Ich schwärme immer mal wieder von regulären Ausdrücken. Das liegt wohl einfach daran, dass ich fast täglich mit ihnen arbeite. Sie sind einfach so unglaublich vielseitig verwendbar und machen ITlern das Leben leichter – wenn man sie beherrscht. Nicht umsonst gibt es diesen „Witz“:

Ich hatte ein Problem und versuchte es mit regulären Ausdrücken zu lösen. Nun habe ich zwei Probleme.

In den Händen eines erfahrenen Anwenders sind reguläre Ausdrücke allerdings äußerst hilfreich.

Sinn regulärer Ausdrücke

Reguläre Ausdrücke dienen der Mustererkennung in Zeichenketten und sind quasi Platzhalter on steroids. Statt der einfachen Platzhalter wie * oder ? z.B. in Dateinamen, gibt es viele verschiedene Platzhalter, Quantifizierer und weitere Regeln, um Muster in Texten zu definieren. Nach diesen Mustern kannst du suchen oder du kannst sie zum Ersetzen von Inhalten benutzen. Teilmuster lassen sich gruppieren und beim Ersetzen wiederverwenden. So gut wie jede Programmiersprache enthält eine eingebaute Unterstützung für reguläre Ausdrücke. Jeder vernünftige Texteditor unterstützt reguläre Ausdrücke beim Suchen und Ersetzen genauso wie eine gute Shell (z.B. Bash oder PowerShell).

Grundlegende Muster

  • konkreten Zeichen(-folgen): hallo
  • Bereiche: [], z.B. [a-z], [0-9], [aeiou]
    • Negation mit ^, z.B. [^abc]
  • Zeilenanfang: ^ (nicht mit der Negation verwechseln!)
  • Zeilenende: $
  • Platzhalter für ein beliebiges Zeichen: .
  • Alternativen: A|B
  • Quantifizierer (stehen hinter dem Muster)
    • einmal oder keinmal (0..1): ?
    • keinmal, einmal oder mehrmals (0..n): *
    • einmal oder mehrmals (1..n): +
    • genaue Anzahl: {8}, {2,5} (2 bis 5 mal)
  • Gruppen: (), Referenz mit $1
  • Escapen von besonderen Zeichen (insb. alle obigen): \

Anwendungsfälle aus meiner Praxis

Reguläre Ausdrücke gehören in den Werkzeugkasten jedes ITlers! Egal ob Anwendungsentwicklung oder Systemadministration, reguläre Ausdrücke können vielfältig eingesetzt werden. In der Linux-Administration können z.B. Black- und Whitelists für Hostnamen mit regulären Ausdrücken definiert werden. Die Apache-Konfiguration verwendet ebenfalls reguläre Ausdrücke. Auf der Linux-Kommandozeile kannst du mit grep in Dateien nach regulären Ausdrücken suchen. sed ermöglicht dir die Massenverarbeitung von Dateien. Das Suchen und Ersetzen im vi wird standardmäßig auch mit regulären Ausdrücken gemacht und du kannst sogar mit ihnen navigieren ($ springt z.B. zum Ende der Zeile).

  • Suchen und Ersetzen in Dateien
  • Listen umformatieren
    • Nachname/Vorname zu Vorname/Nachname
    • Anfang oder Ende von Zeilen manipulieren
    • Markdown in HTML und umgekehrt
    • Feldnamen mit public String ; umschließen
    • Batchdatei generieren zum Verschieben von Dateien
  • Whitespace trimmen
  • UUIDs/Domains/Mails in Text/Logs finden

Konkrete Beispiele

Gerade vor wenigen Tagen hatte ich die – eigentlich triviale – Aufgabe, ein paar Dateien umzubenennen, die ein bestimmtes Präfix hatten. Dieses Präfix sollte ausgetauscht werden. Anstatt die Dateien per Hand umzubenennen (oder die entsprechende Shell-Funktion zu nutzen 😉 ), habe ich mir mit einem simplen regulären Ausdruck in wenigen Sekunden ein Shell-Script gebaut, das die Aufgabe für mich löst.

Basis war die Liste der Dateien, die ich in der PowerShell mit dir | ac liste.ps1 erstellt habe.

prefix-Datei1.txt
prefix-Datei2.txt
...
prefix-Datei100.txt

Mit dem Suchen-/Ersetzen-Muster /^(prefix-(.*))$/move $1 neuerPrefix-$2/g im Vim wurde daraus:

move prefix-Datei1.txt neuerPrefix-Datei1.txt
move prefix-Datei2.txt neuerPrefix-Datei2.txt
...
move prefix-Datei100.txt neuerPrefix-Datei100.txt

Die Datei konnte ich dann einfach mit .\liste.ps1 ausführen und war fertig!

  • UUIDs suchen
    • Text: Text mit UUIDs wie z.B. 550e8400-e29b-11d4-a716-446655440000 mittendrin
    • RegEx: [a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}
    • Suchergebnis: 550e8400-e29b-11d4-a716-446655440000
  • E-Mail-Adressen suchen
    • Text: Stefan Macke (mail@example.com) hat einen Podcast.
    • RegEx: [a-z]+@[a-z]+\.[a-z]{2,3} (nicht ausreichend für echte Mails!)
    • Suchergebnis: mail@example.com
  • Vor-/Nachnamen vertauschen
    • Text: Stefan Macke
    • RegEx: (.+) (.+)
    • Ersetzen durch: $2, $1
    • Ergebnis: Macke, Stefan
  • Trailing Whitespace entfernen
    • Text: Zeile mit Leerzeichen am Ende
    • RegEx: +$
    • Ersetzen durch: „
    • Ergebnis: Zeile mit Leerzeichen am Ende
  • Aus Zeilen Markdown-Aufzählungen machen
    • Text: Listenpunkt 1
    • RegEx: ^
    • Ersetzen durch: * (Asterisk muss ggfs. escapet werden)
    • Ergebnis: * Listenpunkt 1
  • Aus Namen Java-Attribute machen
    • Text: alterDerPersonInJahren
    • RegEx: (.+)
    • Ersetzen durch: private Integer $1;
    • Ergebnis: private Integer alterDerPersonInJahren;
  • Aus HTML-Links Markdown machen
    • Text: <a href="https://it-berufe-podcast.de">IT-Berufe-Podcast</a>
    • RegEx: <a href="([^"]+)">([^<]+)</a>
    • Ersetzen durch: [$2]($1 "$2") (Klammern müssen ggfs. escapet werden)
    • Ergebnis: [IT-Berufe-Podcast](https://it-berufe-podcast.de "IT-Berufe-Podcast")

Grenzen regulärer Ausdrücke

Wofür du reguläre Ausdrücke nicht benutzen solltest:

  • XML und HTML auseinandernehmen: Dafür brauchst du einen echten XML-Parser, da diese Sprachen zu „hoch“ für reguläre Ausdrücke sind.
  • Performance-kritische Aktionen: Reguläre Ausdrücke sind teuer im Vergleich zu „normalem“ Suchen und Ersetzen, da sie geparst und in einen Zustandsautomaten übersetzt werden müssen. Ein suboptimaler regulärer Ausdruck hat sogar schon einmal StackOverflow zum Absturz gebracht.

Programme mit Unterstützung für reguläre Ausdrücke

  • Kommandozeile: grep (Bash), Select-String (PowerShell)
  • Editoren: Vim, Notepad++, Visual Studio Code
  • IDEs: Eclipse, IntelliJ, Visual Studio

Und viele mehr…

Literaturempfehlungen

In diesem (zumindest für mich) spannenden Artikel zeigt Liz Bennett die – teils sehr deutlichen – Performance-Unterschiede zwischen guten und schlechten regulären Ausdrücken: Regexes: the Bad, the Better, and the Best.

In diesem tollen Artikel geht Nikita Popov auf die Hintergründe von regulären Ausdrücken ein und erklärt ganz nebenbei noch die Chomsky-Hierarchie und warum man HTML nicht mit regulären Ausdrücken parsen sollte: The true power of regular expressions. Ein wirklich spannender Artikel, der mir wieder mal zeigt, wie sinnvoll es ist, reguläre Ausdrücke zu beherrschen.

Eine witzige Möglichkeit, reguläre Ausdrücke zu lernen, ist übrigens das Regex Crossword. Damit habe ich auch schon einige Stunden verbracht! 😀

In Kapitel 10 (Konzepte der Programmierung) geht Sascha Kersken im IT-Handbuch für Fachinformatiker* auf reguläre Ausdrücke ein und zeigt Programmierbeispiele in Java und Python.

Sascha Kersken - IT-Handbuch für Fachinformatiker: Für Fachinformatiker der Bereiche Anwendungsentwicklung und Systemintegration. Inkl. Prüfungsfragen und Praxisübungen (Affiliate)*

Links

Zusammenfassung

Muster in Texten finden

Ich setze reguläre Ausdrücke fast täglich ein, etwa wenn ich aus großen Dateien bestimmte Angaben herausfiltern möchte. Du beschreibst damit, wie ein gesuchter Text aufgebaut ist, und kannst anschließend die passenden Stellen bearbeiten. Dabei legst du fest, welche Zeichen vorkommen dürfen und wie oft sie erscheinen sollen.

Ein Beispiel sind unterschiedliche Schreibweisen des Nachnamens Meier. Ein Suchmuster kann mehrere Varianten erfassen. Auch E-Mail-Adressen lassen sich anhand ihres Aufbaus in einer Datei finden, obwohl dir die konkreten Adressen vorher unbekannt sind.

Für dich als IT-Azubi gehört das Thema sowohl zur Anwendungsentwicklung als auch zur Systemintegration. Systemadministrator:innen bearbeiten beispielsweise Listen mit Benutzernamen oder filtern Angaben aus Dateien.

Die Grundbausteine verstehen

  • Wörtlicher Text: Hallo sucht genau diese Zeichenfolge.
  • Escaping: Hat ein Zeichen eine besondere Bedeutung, setzt du für die wörtliche Suche einen Backslash davor. Mit \. suchst du einen Punkt. Das @ kannst du direkt schreiben.
  • Zeichenbereiche: Eckige Klammern legen fest, welches Zeichen an einer Stelle stehen darf. [a-z] steht für einen Kleinbuchstaben, [0-9] für eine Ziffer. Mehrere Bereiche kannst du innerhalb derselben Klammern verbinden. Einzelne Zeichen lassen sich ebenfalls aufführen, etwa die Vokale in [AEIOU].
  • Bereiche ausschließen: Ein ^ direkt am Anfang einer Zeichenklasse schließt die folgenden Zeichen aus. [^AEIOU] erfasst jedes Zeichen außerhalb dieser Auswahl. Dazu gehören auch Sonderzeichen.
  • Zeilenanfang und Zeilenende: Im beschriebenen Einsatz steht ^ für den Zeilenanfang und $ für das Zeilenende. So findest du beispielsweise mit ^# Zeilen, die mit einer Raute beginnen, etwa auskommentierte Einstellungen in einer Linux-Konfigurationsdatei.
  • Beliebiges Zeichen: Der Punkt . steht für ein einzelnes beliebiges Zeichen.
  • Alternativen: Eine Pipe | verbindet mögliche Suchmuster. Mit A|B suchst du nach A oder B. Auf diese Weise kannst du auch bekannte Schreibweisen eines Namens aufführen.

Die Bedeutung eines Zeichens hängt von seiner Position ab. Das ^ am Anfang einer Zeichenklasse schließt Zeichen aus; außerhalb dieses Bereichs dient es als Anker für den Zeilenanfang.

Festlegen, wie oft ein Muster vorkommt

Quantifizierer stehen hinter dem Zeichen oder Muster, auf das sie sich beziehen:

| Zeichen | Bedeutung |
| — | — |
| ? | Nullmal oder einmal |
| * | Nullmal oder beliebig oft |
| + | Mindestens einmal |
| {8} | Genau achtmal |
| {2,5} | Mindestens zweimal, höchstens fünfmal |

Mit .* beschreibst du beliebig viele beliebige Zeichen. .+ verlangt mindestens ein Zeichen.

Das vereinfachte E-Mail-Beispiel lautet [a-z0-9]+@[a-z]+\.[a-z]{2,3}. Vor dem @ stehen dabei mindestens ein Kleinbuchstabe oder eine Ziffer, dahinter mindestens ein Kleinbuchstabe. Nach dem wörtlichen Punkt folgen zwei bis drei Kleinbuchstaben.

Dieses Beispiel deckt eine begrenzte Auswahl ab. Echte E-Mail-Adressen erlauben weitere Zeichen, und Top-Level-Domains können länger sein. Beim Schreiben eines Suchmusters musst du deshalb wissen, welche Varianten deine Datei enthält. Auch Großbuchstaben musst du berücksichtigen, wenn sie im Text vorkommen.

Auf Teile eines Treffers zugreifen

Runde Klammern bilden Gruppen, deren Inhalte du später wiederverwenden kannst. Bei einer E-Mail-Adresse lässt sich beispielsweise die Domain als Gruppe erfassen und separat ausgeben.

Beim Ersetzen greifst du über Gruppenreferenzen auf diese Inhalte zu. Je nach Editor heißen sie \1 und \2 oder $1 und $2. Für eine einfache Liste mit jeweils einem Vor- und Nachnamen sucht (.+) (.+) beide Teile als Gruppen. Durch Ersetzen mit $2, $1 entsteht das Format "Nachname, Vorname". Das Beispiel setzt Namen ohne zusätzliche Bestandteile voraus.

Beispiele aus meinem Alltag

  • UUIDs herausfiltern: In einer großen Textdatei habe ich UUIDs anhand ihrer Hexadezimalzeichen und Bindestriche gefunden. Die Blöcke enthielten 8, 4, 4, 4 und 12 Zeichen. Dafür beschreibst du die erlaubten Zeichen von A bis F sowie 0 bis 9 und ergänzt die jeweilige Anzahl in geschweiften Klammern.
  • Leerzeichen am Zeilenende entfernen: Das Muster +$ findet ein oder mehrere Leerzeichen unmittelbar vor dem Zeilenende. Wenn du den Treffer durch einen leeren Text ersetzt, verschwinden diese Leerzeichen.
  • Aufzählungszeichen einfügen: Du suchst nach ^ und ersetzt den Zeilenanfang durch * , um Zeilen als Markdown-Liste zu schreiben. Ob du das Sternchen im Ersatztext escapen musst, hängt vom Editor ab.
  • Felder für eine Klasse vorbereiten: Mit (.+) erfasst du den Inhalt einer Zeile. Der Ersatztext private Integer $1; ergänzt den Text davor und das Semikolon dahinter. Als weitere Möglichkeit erwähne ich den Blockmodus einer IDE, mit dem du mehrere Zeilen gleichzeitig bearbeiten kannst.
  • Links umschreiben: Bei einfachen HTML-Links erfasse ich die URL und den Linktext in getrennten Gruppen. Diese setze ich anschließend an den passenden Stellen der Markdown-Syntax ein. Ähnliche Schritte sind bei anderen Textformaten möglich.

Grenzen beachten

Für meine einfachen Links arbeite ich mit einer Textdatei, deren Inhalt ich kenne und kontrolliere. Sobald ein Programm beliebige HTML- oder XML-Dokumente verarbeiten soll, brauchst du einen entsprechenden Parser. Verschachtelte Tags und ihre passenden schließenden Tags erfordern mehr als die beschriebenen regulären Suchmuster. Als theoretischen Hintergrund nenne ich die Chomsky-Hierarchie.

Auch der Rechenaufwand spielt eine Rolle. Reguläre Ausdrücke werden intern in einen Zustandsautomaten überführt und können viel Rechenzeit beanspruchen. Wenn es in deiner Anwendung auf Millisekunden ankommt, solltest du einfache String-Funktionen als mögliche Lösung prüfen. Ein verlinkter Bericht über einen Ausfall von Stack Overflow zeigt, wie ein aufwendiger regulärer Ausdruck den Betrieb einer Website beeinträchtigen kann.

In deinen Werkzeugen ausprobieren

Auf der Kommandozeile kannst du mit grep nach regulären Ausdrücken suchen. PowerShell bietet dafür Select-String.

Bei den Editoren nenne ich unter anderem Notepad++ und Visual Studio Code, außerdem vi und Emacs. Auch IDEs wie Eclipse und IntelliJ unterstützen reguläre Ausdrücke; weitere Beispiele sind Visual Studio und PhpStorm. Die Grundbausteine kannst du in verschiedenen Werkzeugen anwenden, wobei sich insbesondere die Syntax beim Ersetzen unterscheiden kann.

Zum Lernen empfehle ich dir, eigene Muster mit Beispieltexten auszuprobieren. Websites wie regextester.com erläutern die einzelnen Zeichen eines Ausdrucks und zeigen dir, welche Textstellen passen. Meine Beispiele und weitere Links stehen in den Shownotes zur Episode 160 auf der Podcast-Website.

Im IT-Handbuch für Fachinformatiker von Sascha Kersken findest du ebenfalls einen Einstieg. In der zum Zeitpunkt der Aufnahme aktuellen Ausgabe behandelt Kapitel 10 reguläre Ausdrücke anhand von Java und Python.

Transkription der gesamten Episode

Automatisch erzeugte Transkription der Episode

[0:01] Herzlich willkommen zum IT-Berufe-Podcast, dem Podcast rund um die Ausbildung in den IT-Berufen.

[0:08] In dieser Episode geht es um ein Schweizer Taschenmesser für ITler, und zwar reguläre Ausdrücke. Viel Spaß!

[0:20] Hallo und herzlich willkommen zur 160. Episode des IT-Berufe-Podcasts.

[0:26] Mein Name ist Stefan Macke und heute geht es mal um ein Thema, was mir persönlich sehr am Herzen liegt,

[0:31] weil ich diese Technologie fast täglich anwende in meinem Alltag, würde ich sagen.

[0:35] Es gibt immer mal wieder einen Einsatzzweck dafür.

[0:38] Und ich habe noch nie so richtig darüber gesprochen, immer so nebenbei, zum Beispiel mit Buchclubs und so weiter.

[0:43] Aber heute möchte ich dem Thema mal eine eigene Episode widmen, und zwar reguläre Ausdrücke.

[0:49] Wer das noch nie gehört hat, da geht es darum, dass wir quasi Muster in Texten definieren können und finden können,

[0:55] und dann auch zum Suchen und Ersetzen benutzen können.

[0:58] Das erst mal so ganz grob gesagt.

[1:00] Wenn du es vergleichst vielleicht, wenn du auf der Kommandozeile irgendwo dir Dateien anzeigen möchtest,

[1:05] mit dir zum Beispiel unter Windows oder mit ls auf Linux, da kannst du so Platzhalter angeben,

[1:10] wie zum Beispiel Sternchen, und dann sowas schreiben wie Sternchen.jpg,

[1:15] und dann zeigt er dir alle Dateien an, die jpg heißen hinten, egal welcher Dateiname davor steht.

[1:20] Dafür steht halt das Sternchen als Platzhalter für beliebig viele Zeichen.

[1:24] Und die regulären Ausdrücke können jetzt noch ein bisschen mehr als das.

[1:28] Nicht einfach nur beliebig viele Zeichen oder ein Zeichen, zum Beispiel das Fragezeichen bei diesen Dateinamen,

[1:33] sondern ganz, ganz, ganz viel mehr.

[1:35] Und damit kann man sehr komplexe Konstrukte bilden, um dann aus Texten bestimmte Informationen rauszuextrahieren

[1:41] und dann auch zu transformieren, eben Suchen und Ersetzen vor allem.

[1:44] Dafür benutze ich es ganz häufig.

[1:46] Und auf den ersten Blick könnte man jetzt meinen, ja mein Gott, wann brauche ich sowas, ja?

[1:50] Aber ich habe extra ein paar Beispiele mitgebracht aus meinem Alltag, um zu zeigen, dass ich das wirklich,

[1:53] also fast täglich brauche ich irgendwo reguläre Ausdrücke oder brauchen.

[1:57] Ich wende sie einfach an, weil ich nichts Besseres habe, das ist jetzt auch blöd gesagt,

[2:02] aber nichts Schnelleres habe oder nichts Einfacheres, darum geht es einfach.

[2:05] Denn wenn man die regulären Ausdrücke beherrscht, kann man damit sehr schnell sehr viele coole Dinge tun.

[2:09] Und wenn man sie nicht beherrscht, ja, dann muss man sich halt irgendwelche anderen Sachen suchen.

[2:13] Und deswegen möchte ich heute einfach mal ein bisschen drüber erzählen.

[2:16] Ich weiß, dass das Thema jetzt auch für eine Podcast-Episode ein bisschen schwierig ist,

[2:19] denn reguläre Ausdrücke sind ja ein bisschen wie eine Programmiersprache.

[2:22] Man muss ja auch die Zeichen lernen und verstehen.

[2:24] Und das Ganze jetzt nur auf der Audiospur wiederzugeben, wird wahrscheinlich ein bisschen schwierig.

[2:29] Aber ich versuche mein Bestes und ich würde dir auf jeden Fall empfehlen,

[2:32] im Nachgang dir mal die Syntax genau anzugucken.

[2:35] Am besten mit so einer Website, die ich auch in den Shownotes habe, einfach mal auszuprobieren.

[2:38] Und dann am besten im Alltag auch mal anzuwenden.

[2:41] Und ich habe auch noch eine Literaturempfehlung am Ende, wo du es wirklich nachlesen kannst,

[2:44] wo das dann ganz genau eingeführt wird und beschrieben wird.

[2:48] Ich möchte jetzt heute die Chance hier nutzen, um einfach mal, ja,

[2:52] kundzutun, wie toll ich diese Möglichkeit finde, in Texten zu suchen und zu ersetzen

[2:57] und was man damit halt so anstellen kann.

[2:59] Und ich hoffe, dass das so ein bisschen rüberkommt und dass du dann motiviert wirst, dir das mal im Detail anzugucken.

[3:04] Jetzt habe ich gerade schon gesagt, das könnte auf der Audiospur ein bisschen schwierig werden,

[3:07] reguläre Ausdrücke vernünftig zu vermitteln.

[3:10] Viele sagen, dass das auch schwierig ist, wenn man sie sehen kann.

[3:14] Denn wenn man sich so fertige, reguläre Ausdrücke mal anguckt, dann sehen die schon ziemlich kryptisch aus.

[3:19] Die bestehen nämlich aus ganz vielen Sonderzeichen und jedes Sonderzeichen hat eine besondere Bedeutung.

[3:23] Und wenn man die jetzt einfach hintereinander liest, wird man nicht auf die Idee kommen,

[3:26] dass da irgendwelche Muster in Texten mit gemeint sind,

[3:29] sondern es sieht einfach aus wie, ja, Kraut und Rüben in Anführungszeichen.

[3:32] Es ist also nicht schön lesbar wie so eine Programmiersprache oder sowas,

[3:35] sondern es sind wirklich ein ganzer Haufen an Sonderzeichen, die irgendwie scheinbar wahllos zusammengewuschelt sind.

[3:40] Und deswegen gibt es auch so einen kleinen Witz in der IT.

[3:44] Ich hatte ein Problem und versuchte es mit regulären Ausdrücken zu lösen.

[3:47] Jetzt habe ich zwei Probleme.

[3:49] Einfach, um zu zeigen, dass es wirklich ziemlich kompliziert ist.

[3:53] Wobei es ist eigentlich nur auf den ersten Blick kompliziert.

[3:56] Denn wenn man die Zeichen verstanden hat, ist es relativ einfach, solche regulären Ausdrücke auseinanderzunehmen.

[4:01] Und selbst wenn man sie nicht verstanden hat, gibt es Websites wie die oneonone,

[4:06] z.B. regextester.com.

[4:08] Die habe ich auch in den Shownotes natürlich verlinkt zu dieser Episode.

[4:11] Übrigens findest du die wie immer unter itberufe-podcast.de-160 für die heutige 160. Episode.

[4:17] Und da kann man die einfach eingeben.

[4:19] Da werden die wirklich Zeichen für Zeichen auseinandergenommen mit Erklärungen daneben,

[4:22] was das heißt und was dieses Zeichen in diesem Kontext heißt und so weiter.

[4:26] Also es gibt da schon super Tools, die einem diese regulären Ausdrücke erklären.

[4:29] So ist es jetzt auch nicht.

[4:30] Aber wenn man wirklich gar keine Ahnung davon hat, dann sieht es schon etwas wild aus, sage ich mal.

[4:35] Und dann kann man vielleicht verstehen, wenn der eine oder andere sagt,

[4:37] oh Gott, geh mir mit den regulären Ausdrücken weg, das habe ich noch nie verstanden.

[4:40] Oder, oh, die sind so kompliziert und so.

[4:42] Also ich finde, sind sie gar nicht.

[4:44] Es gibt so ein paar wichtige Grundbestandteile, die man häufig mal braucht

[4:48] und die man auch im Alltag sehr häufig einsetzen kann.

[4:50] Man muss jetzt nicht die absolut wildesten Kombinationen, die man so gut wie nie benötigt, auch noch können.

[4:56] Von daher, wenn man ein paar Grundbausteine verstanden hat,

[4:59] dann kann man, glaube ich, sehr einfach auch reguläre Ausdrücke verstehen.

[5:03] Natürlich, wenn sie lang sind, ist es genau wie bei Programmen, wie ich programmiert habe.

[5:06] Wenn lange Programme, muss ich auch ein bisschen Zeit investieren, um die zu verstehen.

[5:09] Bei regulären Ausdrücken das Gleiche.

[5:11] Aber ich würde heute auf jeden Fall mal so die wichtigsten Muster oder Bestandteile

[5:15] von solcher regulären Ausdrücke mal einmal durchgehen.

[5:18] Dann hast du die wenigstens schon mal gehört.

[5:20] Und dann würde ich halt dringend empfehlen, die nochmal nachzulesen.

[5:22] Wie gesagt, Literaturempfehlung, dazu habe ich auch.

[5:25] Und nachdem wir uns das angeguckt haben, wie die grundsätzlich funktionieren,

[5:28] habe ich dann ein paar konkrete Anwendungsfälle aus meiner Praxis mitgebracht,

[5:31] um dir zu zeigen, wofür man sowas eigentlich einsetzen kann.

[5:34] Woran man vielleicht sonst gar nicht so denkt, dass man das damit lösen könnte.

[5:38] Dann noch ein kurzer Ausblick, wo du vielleicht reguläre Ausdrücke nicht für benutzen solltest.

[5:43] Denn es ist, in der Einleitung habe ich schon gesagt, es ist ja das Schweizer Taschenmesser für IT-ler.

[5:48] Aber das heißt nicht, dass es ein goldener Hammer ist,

[5:50] mit dem du auf alles draufkloppen musst.

[5:52] Also du kennst vielleicht das Sprichwort, wenn du nur einen Hammer hast, sieht alles aus wie ein Nagel.

[5:56] So ist es bei regulären Ausdrücken nicht.

[5:58] Du kannst nicht alles damit lösen.

[6:00] Und es gibt gewisse Grenzen, die solltest du einfach kennen,

[6:02] um zu wissen, wofür du dieses Werkzeug sinnvollerweise einsetzen kannst.

[6:06] Zum Schluss, wie gesagt, noch ein paar Literaturempfehlungen, dann sind wir auch schon durch.

[6:09] Und den Rest musst du dann sowieso anlesen oder ausprobieren auf den Websites, wie gesagt.

[6:13] Von daher würde ich sagen, wir steigen einfach mal ein mit dem Aufbau von regulären Ausdrücken.

[6:19] Das heißt mit der grundsätzlichen Idee noch mal einmal kurz erklärt.

[6:23] Ich hatte das Beispiel mit diesen Dateinamen schon genannt.

[6:26] Und das kennst du vermutlich von deiner Kommandozeile.

[6:29] Das häufigste Beispiel für so einen Platzhalter in beliebigen Texten ist eben das Sternchen.

[6:35] Oder auf Englisch der Begriff Asterisk.

[6:38] Das ist das Ding, was du eingibst mit Shift und dem Pluszeichen neben deinem Enter.

[6:42] Dieses kleine Sternchen auch als Malzeichen benutzt.

[6:44] Und das wird in ganz vielen Sprachen oder Tools oder Editoren, wie gesagt, als Platzhalter benutzt für irgendein Zeichen beliebig oft.

[6:53] Das heißt, wie gesagt, wenn du sowas eingibst wie dir, Sternchen.jpg, dann kann anstelle des Sternchens irgendwas stehen.

[7:00] Da könnte ABC stehen oder Hallo oder ich weiß nicht was.

[7:03] Und dann wird halt alles gesucht, was eben diesem Muster entspricht.

[7:09] Und jetzt sind die regulären Ausdrücke sehr, sehr ähnlich aufgebaut.

[7:14] Das heißt, es gibt Zeichen, die Platzhalter für andere sind.

[7:17] Es gibt aber auch so Zeichenbereiche, wo ich sagen kann, an dieser Stelle hätte ich gerne ein Zeichen, aber zum Beispiel nur die Buchstaben von A bis F, meinetwegen.

[7:25] Wenn ich zum Beispiel Hexadezimalzahlen suche oder sowas.

[7:28] Und dann kann ich aber auch etwas feingliederiger als nur mit diesem Sternchen zum Beispiel sagen, wie oft bestimmte Zeichen auftauchen sollen.

[7:36] Das wird hier ein bisschen getrennt.

[7:37] Das ist also nicht hier wie bei dem Sternchen ein beliebiges Zeichen beliebig oft, sondern das wird halt einmal aufgeteilt.

[7:43] Beliebiges Zeichen und ein zweites Zeichen steht dann für beliebig oft zum Beispiel.

[7:48] Also die regulären Ausdrücke können mehr als dieser simple Platzhalter Sternchen, sind dann aber logischerweise auch ein bisschen komplizierter.

[7:56] Einfach weil du mehr Zeichen brauchst, um das gleich auszudrücken, weil du einfach mehr ausdrücken kannst.

[8:01] Das heißt also, das Tool ist sehr mächtig, das kann sehr viel, aber du musst es halt eben auch beherrschen und den Sinn der einzelnen Zeichen verstehen,

[8:09] um genau das formulieren zu können, was du auch wirklich ausdrücken möchtest.

[8:13] So und jetzt ist dieser grundsätzliche Sinn hinter den regulären Ausdrücken, also ein Muster in Texten zu erkennen.

[8:19] Jetzt kann man sich fragen, ja gut, wofür braucht man das?

[8:21] Nehmen wir nochmal dieses Beispiel mit dem Sternchen auf der Kommandozeile.

[8:25] Also wenn du ein Verzeichnis hast, in dem ein paar hundert Dateien liegen und meinetwegen JPEG-Dateien und Excel-Dateien und DOC-Dateien oder wie auch immer,

[8:32] und du möchtest nur die JPEG-Dateien löschen, dann wird es relativ frickelig, die 57 Dateien, die JPEG heißen, einzeln rauszusuchen und einzeln zu löschen.

[8:40] Also auf der Kommandozeile sowas wie rm auf Linux oder del auf Windows, ja, und dann jede einzelne Datei anzugeben, da wirst du ja verrückt.

[8:47] Da musst du 57 mal del JPEG-1, del JPEG-2 eingeben und so weiter.

[8:51] Das heißt, hier wäre ein Platzhalter ganz sinnvoll, wo du dann was sagst, del Sternchenpunkt JPEG,

[8:55] und dann werden einfach alle JPEG-Dateien gelöscht, egal wie sie heißen vor der Dateiendung.

[8:59] Und genau darum geht es eigentlich auch bei regulären Ausdrücken.

[9:01] Wenn du in Texten irgendetwas suchen willst, dann kannst du halt eine wörtliche Suche machen,

[9:06] das kann eigentlich jeder Texteditor, sogar der dumme Notepad in Windows kann das, ja,

[9:10] also STRG-F, suchen, und dann gibst du halt einen Text ein und dann findet er exakt diesen Text in deinem Text.

[9:16] Ja, logisch, wenn er nicht da ist, findet er halt auch nichts.

[9:18] So, aber problematisch wird es halt, wenn der Text, den du suchst, eben nicht exakt definiert ist,

[9:23] sondern sich vielleicht ein bisschen unterscheiden kann, oder wenn du eben genau nach solchen Mustern suchen willst

[9:29] und du vielleicht nicht genau weißt, wie es aufgebaut ist, oder du weißt, wie es aufgebaut ist,

[9:33] aber eben nicht genau, wie die Werte sind.

[9:35] Nehmen wir mal ein simples Beispiel, du suchst zum Beispiel den Herrn Meier in deinem Text.

[9:39] Und jetzt kann Meier, der deutsche Nachname, ja ziemlich unterschiedlich geschrieben sein,

[9:43] mit A, I, mit E, Y, mit, ich weiß nicht was, sogar M, A, Y, R habe ich schon mal gesehen.

[9:49] Ja, also es gibt die wildesten Schreibweisen.

[9:51] Und wenn du jetzt nur von deinem, keine Ahnung, Mitarbeiter gehört hast, such mal den Herrn Meier,

[9:56] und du hast aber keine Ahnung, wie der geschrieben wird, ja, wonach willst du denn jetzt suchen?

[9:59] Dann müsstest du jetzt jede einzelne Kombination von Meier, die dir einfällt, im Text suchen

[10:02] und hoffen, dass es die da gibt, ja?

[10:04] Und wenn du jetzt einfach sagst, Mensch, Meier, okay, das fängt mit einem großen M an

[10:08] und hört mit einem R auf und dazwischen kann stehen ein A, ein Y, ein E, ein I,

[10:13] dann hast du quasi schon ein Muster, nach dem du dort suchen kannst.

[10:16] Also anstatt einfach exakt nach M, E, I, E, R zu suchen, für die Standardschreibweise von Meier,

[10:21] jedenfalls in meiner Welt, ja, könntest du einfach sagen, such mir doch mal einen Text,

[10:25] der mit einem großen M anfängt, mit einem kleinen R aufhört

[10:28] und wo dazwischen irgendwo A, Y, E oder I zusammengewürfelt stehen.

[10:33] Und dann hättest du auf einen Schlag alle möglichen Schreibweisen von Meier in deinem Text gesucht

[10:38] und müsstest nicht alle per Hand eingeben.

[10:41] Das heißt, du hast wirklich schon mal eine kleine Arbeitserleichterung, eine Zeitersparnis,

[10:44] weil du halt nicht alles, alle Kombinationsmöglichkeiten quasi händisch durchprobieren musst, ja?

[10:50] Oder ein anderes Beispiel, du sollst irgendwie, keine Ahnung, aus einem E-Mail-Protokoll

[10:54] alle E-Mail-Adressen, die da benutzt wurden, raussuchen.

[10:57] Das ist tatsächlich sogar ein echter Angangsfall, den ich schon mal hatte, ja?

[11:00] Mir ein Kollege aus dem Vertrieb so eine Riesendatei gegeben, da waren irgendwo E-Mail-Adressen drin

[11:03] und die sollte ich alle raussuchen, damit er die dann anschreiben konnte.

[11:06] So, und jetzt die Frage, wie machst du das?

[11:08] Du hast keine Ahnung, welche E-Mail-Adressen drinstehen, wie die heißen, wie die Domains sind,

[11:12] du weißt nichts, ja?

[11:13] Und jetzt könntest du hergehen und händisch die ganze Datei durchscrollen, ja, könntest du machen.

[11:17] Oder du baust dir halt ein Muster und sagst, ich suche bitte nach Zeichenketten,

[11:20] die wie folgt aufgebaut sind.

[11:22] Irgendwelche Zeichen beliebig oft, dann kommt ein At-Zeichen,

[11:26] dann kommen nochmal irgendwelche Zeichen beliebig oft,

[11:28] dann kommt ein Punkt und dann kommen meinetwegen zwei bis drei Buchstaben.

[11:32] Das ist dann die Top-Level-Domain, ja?

[11:34] Und mit diesem Muster kannst du jetzt den ganzen Text durchsuchen

[11:37] und dann findet er alle E-Mail-Adressen.

[11:39] Natürlich nur, wenn die so aufgebaut sind.

[11:41] Es gibt ja auch noch lokale E-Mail-Adressen, die gar keine Domain haben und so weiter.

[11:44] Das nehmen wir jetzt mal alles raus, sind Ausnahmen, ja?

[11:46] Aber die normalen E-Mail-Adressen, die man so draußen kennt

[11:48] und von Geschäftspartnern wahrscheinlich bekommt,

[11:50] sehen halt irgendwie so aus.

[11:52] Zeichen, At, Zeichen, Punkt, Zeichen, ja?

[11:55] Und wenn du dieses Muster dann benutzt, um danach zu suchen,

[11:57] dann findest du auf einen Schlag alle E-Mail-Adressen

[11:59] und kannst die rausfiltern, was auch immer du damit tun willst.

[12:03] Also, das nochmal zum grundsätzlichen Sinn,

[12:05] warum wir als ITler diese Dinge eigentlich kennen sollten.

[12:08] Und das hat auch nichts mit Programmierung zu tun.

[12:10] Im Gegenteil, das ist für mich, für alle IT-Berufe interessant.

[12:13] Insbesondere auch für Systemadministratoren, ne?

[12:15] Fachinformatiker, Systemmitigation.

[12:17] Denn die haben ganz häufig solche Aufgaben wie Massenverarbeitung von irgendwelchen Dingen,

[12:21] die halt nicht eins zu eins bekannt sind,

[12:23] sondern irgendwelchen Mustern entsprechen, ne?

[12:25] Ich weiß es nicht. Benutzernamen aus dem Active Directory

[12:28] sind vielleicht einfach Kleinbuchstaben von 1 bis 8 der Länge, ja?

[12:32] Sowas, zum Beispiel. Oder eben E-Mail-Adressen.

[12:34] Oder, ich weiß nicht was, irgendeine Liste,

[12:36] die da auseinandergenommen werden soll, ne?

[12:38] Mitarbeiternamen sollen auseinandergenommen werden

[12:41] und Nachname, Vorname auseinandergenommen werden, wie auch immer, ja?

[12:43] Also alles, wo ich Texte verarbeite,

[12:46] was mich irgendwie per Hand länger als 10 Sekunden kosten würde,

[12:50] da würde ich überlegen, ob ein regulärer Ausdruck vielleicht sinnvoll ist, ne?

[12:53] Also so eine Art, ja, Listen- oder Massenverarbeitung.

[12:56] Und jetzt gucken wir uns nochmal an,

[12:58] wie jetzt also reguläre Ausdrücke aufgebaut sind,

[13:00] welche Bestandteile haben wir da als Möglichkeit,

[13:04] um dort Muster zu definieren.

[13:06] Ganz einfach zum Einstieg.

[13:08] Ich kann wörtlich einfach Text eingeben oder Zeichen eingeben

[13:11] und dann werde ich einfach danach suchen.

[13:14] Das heißt, wenn ich einfach Hallo eingebe,

[13:16] dann findet der reguläre Ausdruck Hallo,

[13:18] genauso wie wenn ich eine wörtliche Suche gemacht hätte, ja?

[13:20] Also wenn ich wirklich Zeichen eingebe,

[13:23] sucht der reguläre Ausdruck mir exakt dieses Zeichen,

[13:26] genauso wie man es eigentlich auch gewohnt ist.

[13:28] Außer dieses Zeichen hat eine besondere Bedeutung.

[13:31] Denn dann müssten wir dafür sorgen,

[13:33] dass dieses besondere Zeichen

[13:35] als ganz normales Zeichen interpretiert wird.

[13:38] Und du weißt schon, wie das geht vielleicht aus der Programmierung,

[13:40] nämlich mit dem Escaping.

[13:42] Das heißt, anstatt, ich nehme jetzt mal das Beispiel Punkt,

[13:45] werde ich gleich noch erklären, was der Punkt bedeutet,

[13:47] aber der Punkt hat eine besondere Bedeutung in einem regulären Ausdruck.

[13:50] Das heißt, wenn ich zum Beispiel, wie eben,

[13:52] nach einer E-Mail-Adresse suche, wo ein Punkt drin steht,

[13:55] um die Top-Level-Domäne abzutrennen,

[13:57] dann muss ich vor dem Punkt einen Backslash schreiben,

[13:59] um diesen Punkt zu escapen.

[14:01] Das heißt, der Punkt hat in einem regulären Ausdruck

[14:03] eine besondere Bedeutung.

[14:05] Die möchte ich aber nicht suchen,

[14:06] sondern ich möchte wirklich den Punkt als Zeichen suchen.

[14:09] Deswegen schreibe ich den Backslash davor.

[14:11] Und so kann ich also, wenn ich simpel

[14:13] nach exakt definiertem Text suchen will,

[14:15] einfach diese Zeichen eingeben,

[14:17] muss nur darauf achten, diese besonderen Zeichen zu escapen.

[14:20] Also, das Beispiel der E-Mail würde dann irgendwie so aussehen,

[14:22] Zeichen, Add, Zeichen, Backslash, Punkt, irgendwelche Zeichen,

[14:28] weil der Punkt eben eine besondere Bedeutung hat.

[14:30] Das Add-Zeichen hat zum Beispiel keine besondere Bedeutung,

[14:32] ist zwar ein Sonderzeichen, aber nicht für reguläre Ausdrücke,

[14:34] deswegen kann ich das einfach 1 zu 1 so hinschreiben.

[14:37] Also, bis jetzt haben wir noch nichts gewonnen.

[14:40] Aber wenn wir mal zurückgehen zu dem Beispiel der E-Mail,

[14:42] wenn ich irgendwelche E-Mail-Adressen suche

[14:44] und ich hatte eben gesagt, ich suche irgendwelche Zeichen,

[14:46] Add-Zeichen und so weiter,

[14:48] was ist denn mit diesen Zeichen gemeint?

[14:50] Da kann ich jetzt nicht ABC eingeben oder irgendwas,

[14:52] weil ich weiß ja nicht, was vor dem Add steht.

[14:54] Das heißt, hier müsste ich jetzt wirklich mal

[14:56] zum ersten Mal ein echtes Muster benutzen.

[14:58] Und ich könnte ein Muster benutzen wie

[15:00] Buchstaben von A bis Z.

[15:02] Ja, das wäre vielleicht ein Muster.

[15:04] Oder Ziffern von 0 bis 9.

[15:06] Oder Großbuchstaben von A bis Z. Oder, oder.

[15:08] Das heißt, ich könnte eine Art Bereich

[15:10] von erlaubten Zeichen eingeben.

[15:12] Und das könnte ich jetzt bei der E-Mail-Adresse auch tun.

[15:14] Da könnte ich sagen, vor dem Add-Zeichen

[15:16] dürfen Kleinbuchstaben, Großbuchstaben,

[15:18] Ziffern stehen.

[15:20] Und die könnte ich dann als sogenannten Zeichenbereich

[15:22] angeben. Und dann sage ich einfach

[15:24] irgendein Buchstabe oder Ziffer,

[15:26] dann kommt das Add-Zeichen,

[15:28] nochmal irgendwelche Buchstaben und Ziffern,

[15:30] dann kommt der Escapede-Punkt und dann

[15:32] nochmal irgendwie nur Buchstaben,

[15:34] weil Top-Level-Domains mit Ziffern

[15:36] kenne ich nicht. Ich glaube, die gibt es nicht.

[15:38] Das heißt, wir müssen auch, wenn wir danach suchen,

[15:40] genau wissen, was für Zeichen an der Stelle erlaubt sind.

[15:42] Das ist schon mal wichtig zu wissen.

[15:44] Wenn ich irgendwie Zeichen angebe,

[15:46] die in der Realität da gar nicht vorkommen,

[15:48] findet der reguläre Ausdruck natürlich auch nichts.

[15:50] Also ich muss schon ziemlich genau wissen,

[15:52] was zum Beispiel in E-Mail-Adressen denn

[15:54] vor dem Add-Zeichen stehen darf.

[15:56] Und da darf natürlich noch mehr stehen als nur Ziffern und Buchstaben.

[15:58] Das ist klar. Übrigens, Groß- und Kleinbuchstaben

[16:00] werden gar nicht unterschieden. Das heißt, ich könnte nur

[16:02] nach Kleinbuchstaben suchen. Wenn allerdings

[16:04] in meinem Text jemand auf die Idee kommt,

[16:06] die E-Mail-Adresse mit Großbuchstaben zu schreiben,

[16:08] was okay ist, was nur keinen Unterschied macht,

[16:10] dann findet der reguläre Ausdruck das nicht.

[16:12] Also wenn ich meine E-Mail-Adresse

[16:14] steffan.macke.altreumauer.de zum Beispiel

[16:16] hinschreibe und ich mache das S und das M

[16:18] von meinen Anfangsbuchstaben groß,

[16:20] dann findet der reguläre Ausdruck das nicht, wenn ich sage,

[16:22] da dürfen nur Kleinbuchstaben stehen. Logisch.

[16:24] Also ich muss einmal wissen, was ist denn da erlaubt,

[16:26] aber auch, was ist denn in meinem konkreten Text,

[16:28] den ich analysieren will, tatsächlich gegeben.

[16:30] Und wenn jetzt meine Kollegen

[16:32] zum Beispiel, die vielleicht von IT

[16:34] noch nicht so viel Ahnung haben,

[16:36] einfach immer mit Großbuchstaben

[16:38] schreiben, auch in ihrer E-Mail-Adresse,

[16:40] ja gut, da muss ich darauf halt eingehen, da muss ich halt

[16:42] sagen, okay, vor dem Ad dürfen wohl auch

[16:44] Großbuchstaben stehen. Also

[16:46] ich nehme jetzt ein ganz simplifiziertes

[16:48] Beispiel, was vor dem Ad-Zeichen stehen

[16:50] darf. Übrigens E-Mail-Adressen

[16:52] ist ein Beispiel für, ich glaube, einen der

[16:54] längsten regulären Ausdrücke, die ich jemals

[16:56] gesehen habe, einfach weil da so viele

[16:58] Kombinationsmöglichkeiten

[17:00] erlaubt sind. Das kannst du dir vielleicht gar nicht

[17:02] vorstellen, weil du nur die üblichen E-Mail-Adressen aus deinem

[17:04] Alltag kennst. Aber was da

[17:06] technisch erlaubt ist, ja, es gibt

[17:08] E-Mail-Adressen ohne Domain-Namen.

[17:10] Es gibt E-Mail-Adressen, ich glaube,

[17:12] sogar ohne Top-Level-Domain, ich glaube, sogar ohne

[17:14] Ad-Zeichen und so weiter. Also da gibt es ganz,

[17:16] ganz viele Sachen. Du kannst dir mal das RFC dazu

[17:18] angucken, den Request for Comments

[17:20] zum Beschreiben

[17:22] von E-Mail-Adressen. Das ist

[17:24] wirklich enorm, was es da alles gibt.

[17:26] Das heißt, wenn du das Ding mal eben

[17:28] eingeben willst, das wird nicht funktionieren. Das ist

[17:30] mehrere Zeilen lang, der reguläre

[17:32] Ausdruck, um beliebige E-Mail-Adressen

[17:34] auseinanderzunehmen. Von daher, darauf

[17:36] ziele ich jetzt mal nicht ab, sondern ich nehme wirklich ein ganz einfaches

[17:38] Beispiel, sowas wie Name

[17:40] Ad-Domain Punkt Top-Level-Domain.

[17:42] Und um das zu suchen,

[17:44] da dürfte halt vielleicht vor dem Ad-Zeichen

[17:46] eben sowas stehen wie kleinen Buchstaben

[17:48] und Ziffern, aber auch in der Realität

[17:50] weißt du ja schon, da gibt es noch mehr. Da dürftest du auch

[17:52] ein Minuszeichen hinschreiben oder einen Punkt

[17:54] oder ich weiß nicht was.

[17:56] Von daher, es kann beliebig komplex werden.

[17:58] Wir gehen mal davon aus, dass wir da eben nur

[18:00] Ziffern und Buchstaben vielleicht haben. Das heißt,

[18:02] ich könnte sowas sagen, vor dem Ad-Zeichen

[18:04] dürfen eben alle Ziffern von 0 bis

[18:06] 9 und alle Buchstaben von A bis Z

[18:08] zum Beispiel stehen. Und wie gebe ich das

[18:10] jetzt ein in einem regulären Ausdruck?

[18:12] Ja, dafür gibt es solche Zeichenbereiche

[18:14] und die werden in eckigen Klammern

[18:16] umschlossen. Ich hoffe, du kennst

[18:18] noch aus irgendeiner anderen Episode von mir

[18:20] die ganzen verschiedenen Klammern, die es so gibt in der Informatik.

[18:22] Es gibt die runden Klammern,

[18:24] die kennst du auch aus dem Deutschunterricht wahrscheinlich,

[18:26] wenn man irgendwie einen Einschub im Text hat oder sowas.

[18:28] Die ganz normalen mit Shift-8

[18:30] und Shift-9. Dann gibt es die

[18:32] eckigen Klammern und das sind die, die ich jetzt hier meine.

[18:34] Das ist auf der Tastatur das Alt-Grrr

[18:36] mit 8 und 9.

[18:38] Und ja, die sehen halt

[18:40] aus, auf Englisch heißen sie

[18:42] Brackets, und die sehen aus

[18:44] wie so Klammern, die du

[18:46] mit dem Locher,

[18:48] nicht mit dem Locher, mit dem Tacker

[18:50] in DIN A4-Papier zum Beispiel rein

[18:52] tackerst, wenn du irgendwie einen Beleg dran heften willst

[18:54] oder so. Also das sind die

[18:56] eckigen Klammern. Dann haben wir noch die

[18:58] spitzen Klammern, auf Englisch auch

[19:00] Angle Brackets, für Winkel.

[19:02] Das heißt, ja, das ist größer

[19:04] und kleiner Zeichen im Prinzip auf deiner Tastatur.

[19:06] Und dann gibt es noch die geschwungenen

[19:08] Klammern, das sind die, die wir als Programmierer

[19:10] so lieben. Das ist Alt-Grrr, 7

[19:12] und 0 auf deiner Tastatur.

[19:14] Und ja, die sind halt geschweift.

[19:16] Also die sehen aus wie so ein bisschen

[19:18] wie Kuhhörner quasi, wenn du die

[19:20] auf die Seite drehst.

[19:22] Und wovon wir hier jetzt reden, sind eben die

[19:24] eckigen Klammern. Und die

[19:26] macht man quasi auf und zu und dazwischen

[19:28] schreibst du dann den Bereich, den du suchen

[19:30] willst. Und dann kannst du dazwischen eben so was

[19:32] schreiben wie A bis Z, also wirklich

[19:34] A minus Z

[19:36] oder 0 minus 9.

[19:38] Und die kannst du auch hintereinander schreiben in die Klammern,

[19:40] um dann eben mehrere Bereiche zu suchen.

[19:41] Das heißt, wenn wir sowas hätten wie beliebiger Buchstabe oder Ziffer, dann könntest du

[19:46] schreiben, eckige Klammer auf, A bis Z, 0 bis 9, eckige Klammer zu.

[19:51] Und dann hättest du einen, ja, Zeichenbereich definiert, der dann da an der Stelle durchsucht

[19:56] wird.

[19:57] Du kannst auch einfach die Buchstaben oder Ziffern oder Sonderzeichen, die du suchen

[20:01] willst, einzeln aufführen, also eckige Klammer auf, A, E, I, O, U, eckige Klammer zu, würde

[20:07] halt irgendein Vokal zum Beispiel suchen an der Stelle.

[20:10] Und diese Bereiche sind, ja, glaube ich, so das Wichtigste, was man benutzt, zumindest,

[20:15] oder was ich benutze, zumindest in meinem Alltag, weil das nämlich eben genau das ist.

[20:19] Ich weiß nicht genau, welcher exakte Buchstabe oder welches Zeichen da steht, sondern ich

[20:23] definiere eben so einen Bereich aus möglichen Zeichen und das kann ich eben mit diesen eckigen

[20:29] Klammern machen.

[20:30] So, mit diesen Bereichen kann man auch etwas negieren, wenn du als allererstes Zeichen

[20:35] in deinem Bereich das Dach eingibst.

[20:38] Das Dach ist immer so ein Zeichen, wie gibt man das ein?

[20:40] Das ist die Taste links unter dem Escape auf deiner Tastatur, da ist einmal so ein kleiner

[20:46] runder Kreis und darunter ist dieses Dach, also quasi das auf den Kopf gestellte größer

[20:51] oder kleiner Zeichen, ja, und das bedeutet hier in regulären Ausdrucken quasi nicht,

[20:57] das heißt, wenn du sowas machst wie eckige Klammer auf, dann dieses Dach und dann A,

[21:01] E, I, O, U, eckige Klammer zu, dann suchst du nach allen Zeichen, die nicht ein Vokal

[21:06] sind.

[21:08] Wo könnte das sinnvoll sein in der Praxis?

[21:09] Naja, nehmen wir das Beispiel mit den Vokalen.

[21:11] Es gibt im Alphabet, zumindest im deutschen oder im lateinischen Alphabet, gibt es fünf

[21:16] Vokale und demnach 21 Konsonanten.

[21:19] Das heißt, wenn ich jetzt einen Konsonanten suche, dann müsste ich 21 Zeichen per Hand

[21:22] eintippen oder ich nehme einfach die fünf und negiere die, weil dann habe ich automatisch

[21:26] alles, was eben nicht Vokal entspricht.

[21:28] Ist nicht ganz richtig, weil nicht Vokal heißt auch jedes andere Sonderzeichen, ja,

[21:32] ich würde also auch zum Beispiel einen Strich oder sowas finden und nicht nur die Konsonanten

[21:36] des Alphabets, aber es soll das einfach nur verdeutlichen, wofür man es benutzen könnte.

[21:40] So, und jetzt haben wir schon ja einen ersten Eindruck, warum die regulären Ausdrücke

[21:45] so komisch aussehen und so schwierig aussehen, weil wir haben jetzt schon Klammern, wir haben

[21:49] schon dieses komische Dach, ja, das sind ja alles so Zeichen vielleicht, die man nicht

[21:52] unbedingt im Alltag oft benutzt, ja, von daher, das sind etwas kryptische Ausdrücke, die

[21:57] wir da bauen, aber wie gesagt, wenn man die Zeichen einzeln versteht, dann kann man es

[22:00] gut nachvollziehen.

[22:01] Und jetzt kommen wir zu zwei weiteren Zeichen, die auch ganz häufig benutzt werden, und

[22:05] zwar das Zeichen für den Zeilenanfang beziehungsweise das Zeilenende.

[22:08] Wenn ich zum Beispiel weiß, dass mein Text, den ich suche, immer am Zeilenanfang steht,

[22:14] dann kann ich sagen, suche bitte nach Zeilenanfang und dann den Text, den ich suche, und dann

[22:19] wird der Text, der nicht am Zeilenanfang steht, eben auch nicht gefunden, ja.

[22:22] Beispiel aus der Praxis, ich will vielleicht alle auskommentierten Konfigurationseinstellungen

[22:28] in einer Linux-Datei suchen.

[22:29] Dann weiß ich, auskommentiert heißt, die fangen mit einem Hash an, das heißt, ich könnte

[22:33] alle Zeilen suchen, wo am Zeilenanfang das Hash steht, und dann würde ein Hash, das

[22:38] irgendwo mitten in der Zeile steht oder sonstwo, ignoriert bei der Suche, und ich würde wirklich

[22:42] nur die auskommentierten Zeilen finden.

[22:44] Das gleiche beim Ende von Zeilen, wenn ich weiß, keine Ahnung, ein Beispiel, was ich

[22:48] gleich noch habe, am Ende von Dateizeilen habe ich irgendwie aus versehenen Leerzeichen

[22:53] hingesetzt, und das will ich nicht, weil ich das unschön finde, dann kann ich alle Leerzeichen

[22:57] am Ende einer Zeile suchen, das heißt, ich suche nach beliebig vielen Leerzeichen, Ende

[23:02] der Zeile, und dann werden mir nur die Leerzeichen am Ende der Zeile angezeigt und nicht irgendwo

[23:06] mittendrin.

[23:07] Das wäre ja auch blöd, wenn ich einen normalen Text habe und da werden auf einmal alle Leerzeichen

[23:11] gesetzt und nicht nur die am Ende, dann kann ich am Ende ja gar nichts mehr lesen.

[23:13] Also, diese beiden Zeichen sind auch sehr wichtig, Zeilenanfang und Zeilenende, und das

[23:19] Zeilenanfangszeichen in regulären Ausdrücken ist jetzt dieses DACH, was wir eben schon

[23:24] bei der Negation kennengelernt haben, und das Zeilenende ist das DOLLAR-Zeichen.

[23:28] Und jetzt sehen wir schon mal ein weiteres Problem mit regulären Ausdrücken, denn dieses

[23:32] DACH, was wir gerade schon bei der Negation von Bereichen hatten, ist exakt das gleiche

[23:37] Zeichen, was auch für den Zeilenanfang benutzt wird, das heißt, das gleiche Zeichen hat

[23:41] zwei unterschiedliche Bedeutungen, und zwar abhängig davon, in welchem Kontext sie stehen.

[23:45] Also, wenn man einen regulären Ausdruck mit dem DACH anfängt, dann ist das offensichtlich

[23:49] das Zeilenanfangszeichen, steht das aber innerhalb von einem eckigen Klammernbereich und steht

[23:55] dort als erstes Zeichen, dann ist es tatsächlich eine Negation.

[23:59] Also, du musst immer gucken, welches Zeichen habe ich gerade und wo steht es, in welchem

[24:03] Kontext steht es, denn abhängig davon kann die Bedeutung sich eben unterscheiden.

[24:07] DOLLAR-Zeichen für Zeilenende, dafür gibt es allerdings keine zweite Bedeutung, das

[24:12] ist ganz gut, also DOLLAR-Zeichen steht immer für Zeilenende.

[24:15] So, und jetzt kommen wir noch mal zu einem sehr beliebten Platzhalter, und zwar dem Punkt.

[24:22] Der Punkt ist so ein bisschen die Entsprechung eines Sternchens auf der Kommandozeile, obwohl

[24:27] das nicht ganz stimmt, hatte ich nämlich eben schon gesagt, das Sternchen, der Asterisk

[24:32] auf der Kommandozeile steht halt für ein beliebiges Zeichen, und zwar auch gleichzeitig

[24:35] beliebig oft, egal wie es vorkommt, der Punkt in einem regulären Ausdruck steht aber einfach

[24:39] nur für ein einziges beliebiges Zeichen, das heißt, wenn ich einen Punkt reinschreibe,

[24:44] kann da irgendein Zeichen stehen, ein Sonderzeichen, ein Buchstabe, eine Ziffer, ganz egal, aber

[24:49] exakt ein einziges Mal, das heißt, wenn ich drei beliebige Zeichen suche, müsste

[24:53] ich eingeben, Punkt, Punkt, Punkt, und dann würde jeder Punkt für irgendein Zeichen

[24:57] stehen.

[24:58] Jetzt kann man sich aber überlegen, wenn ich Texte suche, die ein bisschen länger

[25:01] sind, dann wird es ziemlich nervig, ganz oft Punkte da einzugeben, ja, und von daher brauchen

[25:05] wir eine Möglichkeit zu sagen, ich hätte gern ein beliebiges Zeichen, aber eine bestimmte

[25:10] Anzahl, beliebig oft, einmal, keinmal, wie auch immer, und dafür brauchen wir jetzt

[25:15] gleich das nächste Ding, was reguläre Ausdrücke uns mitbringen, und zwar die sogenannten

[25:18] Quantifizierer.

[25:19] Mit diesen Quantifizierern kann man sagen, wie oft ein bestimmtes Muster vorkommen soll.

[25:26] Nehmen wir mal das Beispiel mit dem Punkt, hatte ich ja gesagt, ein beliebiges Zeichen,

[25:30] und wenn ich jetzt sage, ich möchte aber ganz, ganz oft dieses Zeichen haben, und zwar

[25:34] zehnmal, dann könnte ich einfach hinter diesem Punkt schreiben, bitte zehnmal ein beliebiges

[25:39] Zeichen.

[25:40] Oder meinetwegen nullmal oder einmal, dann könnte ich einen bestimmten Quantifizierer

[25:44] hinter dem Punkt schreiben, und dann wird halt ein beliebiges Zeichen null oder einmal

[25:48] gesucht.

[25:49] So funktionieren die.

[25:50] Die Quantifizierer werden immer hinter das Muster geschrieben, was ich, ja, quantifizieren

[25:55] will.

[25:56] Also mit dem Beispiel Punkt, wenn ich jetzt sage, ich möchte ein beliebiges Zeichen,

[25:59] aber null oder einmal, dann würde ich dafür den Quantifizierer Fragezeichen benutzen.

[26:05] Dann sieht der Ausdruck so aus, Punkt, Fragezeichen.

[26:09] Punkt steht für beliebiges Zeichen, Fragezeichen steht für das Muster, was davor steht, nullmal

[26:15] oder einmal.

[26:16] So, und das macht den Ausdruck leider schon ein bisschen komplizierter als eben das beliebte

[26:21] Sternchen auf der Kommandozeile.

[26:22] Also um auszudrücken, Sternchen auf der Kommandozeile, irgendein Zeichen beliebig oft, müsste ich

[26:28] das in regulären Ausdrücken mit zwei Zeichen darstellen, und zwar zuerst den Punkt für

[26:32] ein beliebiges Zeichen, und jetzt ist die Frage, was ist denn der Quantifizierer für

[26:36] einmal oder mehrfach, weil das heißt das Sternchen eigentlich, und das wäre in regulären

[26:41] Ausdrücken das Pluszeichen.

[26:44] Es gibt auch das Sternchen in regulären Ausdrücken, das steht für nullmal, einmal

[26:50] oder mehrfach.

[26:51] Das heißt, das Zeichen kann dastehen, und wenn es dasteht, dann einmal oder mehrfach,

[26:55] und das heißt Sternchen.

[26:56] Das heißt, du kannst das Sternchen nicht eins zu eins aus der Kommandozeile in regulären

[27:00] Ausdruck überführen.

[27:01] In Dateinamen wäre es sinnvoll, wenn die Datei einen Namen hat, also das Sternchen

[27:06] bin ich mir jetzt gar nicht sicher.

[27:07] Ich glaube, auf der Kommandozeile matcht es auch gar keinmal.

[27:10] Also wenn du einfach eine Datei heißt, die .jpg heißt, ohne Dateinamen, dann müsste

[27:14] das trotzdem gefunden werden.

[27:15] Das heißt, wenn du dann das Sternchen auf die regulären Ausdrücke überträgst, dann

[27:19] passt es doch ganz gut, weil das Sternchen in regulären Ausdrücken steht eben für

[27:22] nullmal, einmal oder mehrfach.

[27:23] Das heißt, ein beliebiges Zeichen, beliebig oft, würde in regulären Ausdrücken so aussehen,

[27:29] Punkt Sternchen.

[27:30] Punkt, beliebiges Zeichen, Sternchen, nullmal, einmal, keinmal.

[27:33] So, jetzt habe ich die drei Hauptquantifizierer eigentlich schon erklärt.

[27:36] Es gibt einmal das Fragezeichen, das steht für nullmal oder einmal, also quasi entweder

[27:41] ist es da oder nicht, dann gibt es das Sternchen, das für keinmal, einmal oder mehrfach da

[27:48] steht und dann gibt es einmal das Pluszeichen, das wird benutzt, wenn es das Ding mindestens

[27:52] einmal geben muss, aber dann beliebig oft.

[27:55] So, das sind jetzt so ein paar allgemeine Platzhalter, wenn du nicht genau weißt, wie

[28:01] oft Sachen da auftreten sollen.

[28:02] Aber wenn du das genau weißt, dann kannst du das auch explizit hinschreiben, indem du

[28:06] eine Anzahl angibst und das macht man dann mit geschweiften Klammern.

[28:10] Das heißt, wenn du zum Beispiel sagen willst, ich hätte gerne das x und zwar fünfmal,

[28:16] dann könntest du sagen x und dahinter die Anzahl 5 und die schreibt man in geschweifte

[28:20] Klammern und da kannst du einfach die Zahl hinschreiben, die du suchst.

[28:23] Also du könntest sagen x, geschweifte Klammer auf, 8, geschweifte Klammer zu, dann werden

[28:28] genau 8 x-e hintereinander gesucht.

[28:32] Wenn du das jetzt noch anders darstellen willst, wie zum Beispiel Minimum zweimal, maximal

[28:36] fünfmal, könnte man auch das darstellen, geschweifte Klammer auf, 2,5, geschweifte

[28:42] Klammer zu.

[28:43] Das heißt, Minimum zwei, Maximum fünfmal.

[28:47] Es kann aber auch viermal, dreimal auftreten, aber nicht einmal oder sechsmal.

[28:50] Also auch eine genaue Anzahl kannst du angeben.

[28:53] Um diese Quantifizierer jetzt vielleicht nochmal ein bisschen auf die Praxis zu überführen,

[28:58] haben wir unser E-Mail-Beispiel.

[28:59] Da hatte ich gesagt, es gibt ein Buchstaben oder Ziffer vor dem Ad, dahinter nochmal für

[29:05] die Domain und dann einen Punkt und dann zwei oder drei Zeichen für die Top-Level-Domain.

[29:10] Ich weiß, es gibt inzwischen längere Top-Level-Domains, kürzere bin ich mir gar nicht sicher, aber

[29:13] längere auf jeden Fall.

[29:14] Trotzdem bleiben wir mal bei diesem vereinfachten Beispiel.

[29:17] Dann könnte ich sowas machen wie, das Zeichen vor dem Ad kann irgendein Buchstabe oder Ziffer

[29:21] sein.

[29:22] Also gebe ich an, Eckjehl-Klammer auf, a-z, 0-9, Eckjehl-Klammer zu.

[29:27] Damit habe ich irgendein Buchstaben oder eine Ziffer.

[29:30] Und jetzt muss ich noch sagen, wie oft die da stehen muss.

[29:32] Und jetzt möchte ich, dass es mindestens einmal da steht, denn sonst habe ich keine

[29:35] gültige E-Mail-Adresse.

[29:36] Wenn da irgendwie steht, Ad irgendwas, dann fehlt da vor dem Ad was, d.h. da muss mindestens

[29:42] ein Zeichen stehen.

[29:43] Also würde ich ein Plus-Zeichen dahinter schreiben, also hinter die eckigen Klammern

[29:46] einmal das Plus.

[29:47] D.h. Ziffer oder Buchstabe beliebig oft, aber mindestens einmal.

[29:50] Dann gebe ich das wörtliche Ad-Zeichen ein, weil da muss wirklich ein Ad-Zeichen stehen.

[29:56] Dahinter sage ich jetzt einfach mal, Domains dürfen nur aus Buchstaben bestehen.

[29:59] Ist auch nicht richtig, aber geben wir mal davon aus.

[30:01] Dann würde ich hier wieder einen Bereich machen, also Eckjehl-Klammer auf, a-z, Eckjehl-Klammer

[30:05] zu.

[30:06] Und auch hier muss mindestens einmal ein Buchstabe drin sein, sonst habe ich keine

[30:09] gültige Domain.

[30:10] Also mache ich wieder ein Plus dahinter.

[30:12] Jetzt kommt der Punkt.

[30:13] Wir erinnern uns, Punkt heißt beliebiges Zeichen.

[30:16] Ich möchte aber, dass an dieser Stelle wirklich der wörtliche Punkt steht und nicht irgendein

[30:21] anderes Zeichen.

[30:22] Also muss ich den Punkt dahin schreiben, aber escapen mit einem Backslash.

[30:25] Also Backslash, Punkt.

[30:26] Und dann kommt die Top-Level-Domain und da sage ich jetzt, ich möchte wieder einen Bereich

[30:30] haben, Eckjehl-Klammer auf, a-z, Eckjehl-Klammer zu.

[30:33] Und jetzt schreibe ich dahinter aber in geschweiften Klammern 2,3.

[30:37] Und das bedeutet, ich habe zwar Buchstaben, aber mindestens zwei und maximal drei.

[30:42] Wie gesagt, das würde nicht auf echte Domains zutreffen, aber für das Beispiel, ich hoffe,

[30:46] du kannst mir das verzeihen.

[30:47] Und dann hätten wir in diesem simplen Ausdruck schon verschiedene Sachen drin, nämlich Bereiche,

[30:52] Quantifizierer, exakte Quantifizierer oder eben sowas wie Plus, um beliebig oft zu suchen,

[30:57] aber mindestens einmal.

[30:58] Und wir müssen den Punkt escapen, weil er sonst für was anderes stehen würde.

[31:01] Das heißt, schon der reguläre Ausdruck für eine simple E-Mail-Adresse sieht relativ

[31:05] kompliziert aus, mit ziemlich vielen Sonderzeichen, die alle eine besondere Bedeutung haben, aber

[31:09] ich hoffe, du liest das im Nachgang nochmal nach und kannst das dann verstehen und das

[31:13] dann in Zukunft auch vernünftig anwenden, sage ich mal.

[31:16] So, zwei Sachen habe ich noch, die man öfter sieht oder benutzt in regulären Ausdrücken,

[31:20] und zwar einmal Alternativen und Gruppen.

[31:22] Wir gucken uns zuerst die Alternativen an, die sind schnell erklärt.

[31:25] Und zwar, wenn du unterschiedliche Muster suchst und es kann entweder das eine oder

[31:31] das andere auftreten, dann kannst du die mit so einer Art Oder-Zeichen verbinden.

[31:35] Aus der Programmierung kennst du vielleicht die doppelte Pipe, also diesen horizontalen

[31:39] Strich für ein logisches Oder.

[31:41] Und etwas ähnliches wird hier auch benutzt, nämlich die Pipe, aber nur eine davon.

[31:45] Jetzt könntest du zum Beispiel sagen, ich suche entweder das A oder das B, dann könntest

[31:50] du aufschreiben A-Pipe-B und dann steht das eben für die Alternative.

[31:54] Entweder steht hier ein A oder da steht ein B.

[31:58] Beziehen wir das nochmal auf unser Beispiel mit dem Herrn Meier oder der Frau Meier, die

[32:01] wir in unserem Text suchen, dann könntest du auf die Idee kommen, zu sagen, ich hätte

[32:04] ein großes M, dann machst du eckige Klammern auf und machst da A, E, I, Y, was da so erlaubt

[32:11] ist, eckige Klammern zu, und ein R am Ende.

[32:14] Und dann hättest du alle Schreibweisen von Meier gesucht, oder, äh, sorry, hinter die

[32:19] eckige Klammer hättest du noch einen Quantifizierer schreiben müssen, nämlich einen Plus, oder

[32:23] bis hin zu wahrscheinlich sogar zwei bis drei oder so, weil mehr würdest du sonst ja auch

[32:27] finden, M-E-R, aber du brauchst ja I-E-R, also E-E-I, also mehrere Zeichen, das heißt,

[32:32] du müsstest noch einen Quantifizierer dahinter schreiben.

[32:34] Aber lass mir das mal weg.

[32:35] Du könntest auch sagen, ich kenne alle Schreibweisen von Meier und schreibe die als Alternative

[32:39] auf.

[32:40] Das heißt, ich suche entweder Meier mit E-I-E, Pipe, Meier mit A-Y-E-R, Pipe, Meier mit,

[32:49] ich weiß nicht, Y-E-I, keine Ahnung was, du könntest also alle, die du kennst, hintereinander

[32:53] einfach aufschreiben und eine Pipe dazwischen schreiben, und dann würdest du ja auch alle

[32:56] möglichen Schreibweisen finden.

[32:58] Ist eine längere Variante als das mit dem Buchstabenbereich, ja, würde aber auch funktionieren.

[33:03] So, und jetzt kommen wir zum letzten Part, und das ist eigentlich das, wofür ich es

[33:07] in der Praxis am häufigsten benutze, die regulären Ausdrücke, und zwar für die Gruppierung,

[33:10] für die Gruppen.

[33:11] Du kannst mit den ganz normalen, runden Klammern Gruppen bilden, und das bedeutet, dass Teile

[33:17] deines regulären Ausdrucks oder auch der Ganze, den kannst du in Klammern schreiben,

[33:22] und dann merkt sich der reguläre Ausdruck bei jedem Muster, was er findet im Text, genau

[33:27] diese Teile des Suchmusters.

[33:29] Ich nehme mal ein Beispiel.

[33:30] Bleiben wir bei der E-Mail-Adresse, wenn du wissen willst, was für Domains zum Beispiel

[33:35] in den E-Mail-Adressen vorkommen, ja, also gmx.de, web.de, keine Ahnung, itberufepodcast.de,

[33:41] dann könntest du deinen regulären Ausdruck so aufbauen, dass du beliebige Zeichen suchst

[33:44] und ein Add-Zeichen, genau wie eben auch, aber dann machst du über alles hinter dem

[33:48] Add-Zeichen quasi eine Gruppe, indem du runde Klammern davor und dahinter schreibst, und

[33:53] dann würde sich der reguläre Ausdruck, wenn er eine E-Mail-Adresse findet, merken, dass

[33:57] der Teil hinter dem Add-Zeichen, ja, in diesem Fall eine Gruppe bildet, und dann könntest

[34:01] du zum Beispiel in deiner Programmiersprache oder in deinem Texteditor auf diese Gruppe

[34:05] zugreifen und die dann besonders behandeln, zum Beispiel ausgeben oder ersetzen oder sonst

[34:09] irgendwas.

[34:10] Und wenn du also aus einer Liste der E-Mail-Adressen alle Domains rausfinden willst, könntest

[34:15] du eben nach diesen E-Mail-Adressen suchen und könntest dann auf die Gruppe zugreifen,

[34:19] wo die Domain drin steht, und die dann zum Beispiel ausgeben lassen.

[34:22] Und schon hättest du eine Liste aller Domains von deinen E-Mail-Adressen, ohne das, was

[34:27] davor stand.

[34:28] Also die ganzen, was weiß ich, Stefan, Macke, Ed, das würde alles abgeschnitten und nur

[34:31] die Domain würde übrig bleiben.

[34:33] Also kannst du wirklich auf die, ja, Innereien quasi dieses gesuchten Textes zugreifen und

[34:40] die dann beliebig wiederverwenden.

[34:42] Ich nehme mal ein Beispiel aus der Praxis, du hast eine Liste aus Vornamen und Nachnamen

[34:46] mit Leerzeichen getrennt, wir gehen mal davon aus, dass es keine Doppelnamen gibt oder sonst

[34:50] irgendwas, auch wieder sehr reduziert das Beispiel, ja, aber wenn du die quasi ersetzen

[34:53] wolltest durch Nachname, Vorname, dann könntest du das mit so einer Gruppe machen.

[34:58] Also stellen wir uns vor, Liste aus Vornamen, Leerzeichen, Nachnamen, dann sieht dein Muster

[35:03] ungefähr so aus, beliebiges Zeichen oder beliebig viele Zeichen, Leerzeichen, beliebig

[35:08] viele Zeichen.

[35:09] Und jetzt würdest du diese beiden beliebig viele Zeichen einfach in Klammern schreiben

[35:13] und dann würde er quasi die erste Gruppe für den Vornamen bilden und die zweite Gruppe

[35:17] für den Nachnamen und dazwischen steht halt das Leerzeichen.

[35:20] Und wenn du jetzt danach suchst, wie gesagt, merkt sich der reguläre Ausdruck diese beiden

[35:24] Gruppen und wenn du jetzt zum Beispiel sagst in deinem Editor, ich möchte das jetzt ersetzen,

[35:27] dann kannst du in diesem Ersetzen-Ausdruck auf diese Gruppen referenzieren.

[35:31] Und je nachdem, welchen Editor du da benutzt, ist die Syntax ein bisschen unterschiedlich.

[35:35] In den meisten Editoren wird das mit einem Backslash gemacht, Backslash 1 ist zum Beispiel

[35:39] die erste Gruppe, Backslash 2 die zweite und so weiter.

[35:42] Ich kenne aber auch Editoren, wo man das dann mit einem Dollarzeichen macht, also Dollarzeichen

[35:45] 1, Dollarzeichen 2, wie die Variablen Namen PHP zum Beispiel.

[35:50] Und diese, ja, Variablen, in Anführungszeichen, die kannst du dann zum Ersetzen benutzen.

[35:54] Das heißt, wenn du vorher sagst, Gruppe 1, Leerzeichen, Gruppe 2, dann ist Gruppe 1

[35:59] der Vorname, Gruppe 2 ist der Nachname.

[36:01] Und wenn du es jetzt ersetzt durch Backslash 2, Leerzeichen, Backslash 1, dann wird er

[36:08] den Nachnamen nach vorne schreiben, Komma, Leerzeichen dahinter und dahinter den Vornamen.

[36:12] Dann hättest du quasi Vor-Nachname vertauscht mit einem simplen regulären Ausdruck.

[36:17] Das heißt, immer wenn du runde Klammern in deinem regulären Ausdruck siehst, dann weißt

[36:21] du, aha, hier wird gerade eine Gruppe gebildet und die brauchst du eigentlich fast nur, wenn

[36:25] du suchen und ersetzen willst.

[36:27] Wenn du nur suchen willst, sind die Gruppen irrelevant, ja, aber wenn du mit diesem Suchergebnis

[36:31] irgendwas anstellen willst, das ausgeben willst, verarbeiten willst, ändern willst,

[36:34] wie auch immer, dann musst du es halt gruppieren, um auf die Teile deines Ausdrucks zugreifen

[36:39] zu können.

[36:40] So, damit haben wir jetzt erstmal die wichtigsten Inhalte von regulären Ausdrücken oder die

[36:45] wichtigsten Beispiele, um Muster zu definieren.

[36:47] Es gibt noch ein paar mehr, wie gesagt, die geben wir jetzt hier alle nicht im Detail durch,

[36:50] das führt zu weit, aber ich wiederhole nochmal so ein paar allgemeine Sachen, die man jetzt

[36:55] benutzen kann.

[36:56] Wenn du irgendein Zeichen eingibst, wird das exakt so gesucht.

[36:59] Außer, es ist ein Sonderzeichen, was eine besondere Bedeutung hat, dann musst du es

[37:03] escapen und zwar mit dem Backslash.

[37:05] Wenn du Zeilenanfang und Zeilenende suchst, sind das das Dach bzw. das Dollarzeichen.

[37:12] Wenn du einen Bereich von Zeichen suchst, also A bis Z oder 0 bis 9 oder sonst irgendwas,

[37:18] dann machst du eckige Klammern dadrum.

[37:20] Wenn das erste Zeichen in diesen eckigen Klammern ein Dach ist, ist das eine Negation, das heißt,

[37:25] es wird alles gesucht, was nicht diesem Bereich entspricht.

[37:29] Wenn du bestimmte Alternativen suchen willst, also A oder B oder C oder wie auch immer,

[37:35] kannst du Pipes dazwischen schreiben.

[37:37] Wenn du irgendein beliebiges Zeichen suchen willst, ganz egal, was für eins, auch inklusive

[37:41] Sonderzeichen usw., nimmst du den Punkt.

[37:43] Der Punkt steht für irgendein Zeichen.

[37:46] Und wenn du jetzt die Sachen, die du da angegeben hast, quantifizieren willst, also wie oft

[37:51] sie auftreten, dann gibt es jeweils die verschiedenen Quantifizierer, die hinter das Muster geschrieben

[37:56] werden, und da gibt es das Fragezeichen, einmal oder keinmal, dann gibt es das Sternchen,

[38:00] nullmal, einmal oder mehrfach, und das Pluszeichen, einmal oder mehrfach.

[38:05] Und wenn du es ganz genau angeben willst, kannst du es in geschweifte Klammern schreiben

[38:09] und einfach eine Zahl angeben, also geschweifte Klammer auf 8, geschweifte Klammer zu exakt

[38:13] 8 mal, oder geschweifte Klammer auf 2,5, geschweifte Klammer zu 2 bis 5 mal, also auch 3 oder 4

[38:20] mal.

[38:21] Und wenn du dann Teile deines Ausdrucks benutzen willst, um sie zum Beispiel zu ersetzen oder

[38:25] sonst irgendwas, dann gruppierst du diese Teile bitte mit runden Klammern, die du einfach

[38:30] um den Ausdruck drumherum schreibst.

[38:32] Und die Referenz ist dann, je nach Editor, entweder backslash 1234, je nachdem, welches

[38:37] Muster es ist, oder dollar 1234 und so weiter.

[38:41] So, jetzt habe ich lange erklärt, wie die Syntax von den regulären Ausdrücken aussieht,

[38:45] und jetzt bringe ich mal ein paar Beispiele aus meiner Praxis, die ich noch so im Kopf

[38:49] hatte aus den letzten Tagen und Wochen, was ich da so im Alltag mitmache.

[38:52] Dann gehe ich jetzt einfach mal wahllos von oben nach unten durch und erkläre mal, was

[38:55] der Sinn dahinter war.

[38:56] Ich hatte eine riesengroße Textdatei, in der ganz, ganz viele UUIDs drin waren.

[39:01] UUIDs, wenn du es noch nie gehört hast, sind so auf Knopfdruck generierte IDs in Hexadezimalschreibweise,

[39:07] die global eindeutig sind.

[39:09] Die sind ziemlich lang und die kann normalerweise jede Programmiersprache erzeugen und die werden

[39:13] häufig in Datenbanken zum Beispiel benutzt, um dort Datensätze eindeutig mit Schlüsseln

[39:17] zu versehen.

[39:18] Und ich hatte eben so eine große Textdatei und sollte die alle raussuchen, weil ich damit

[39:21] was machen musste.

[39:22] Und dann kann man bei diesen UUIDs ziemlich genau dieses Muster definieren, wie die aufgebaut

[39:26] waren.

[39:27] Das ist, wie gesagt, eine sehr lange Hexadezimalkette und ich konnte einfach sagen, die Hexadezimalzeichen

[39:32] sind immer A-Z oder 0-9, beziehungsweise, sorry, ich sehe gerade in meiner eigenen Aufzeichnung,

[39:38] dass das Muster Quatsch ist, natürlich, Hexadezimalzeichen gehen nicht bis Z, sondern bis F, wie Friedrich.

[39:42] Das heißt, das Muster muss so aussehen, A-F, 0-9 und dann kann ich genau sagen, wie dieses

[39:49] UUID-Ding aufgebaut ist und zwar sind das immer Blöcke von Hexadezimalziffern, dann

[39:53] kommen immer Bindestriche dazwischen und das dann ein paar Mal hintereinander.

[39:56] Und so konnte ich einfach sagen, die UUIDs sind so aufgebaut, Hexadezimalzeichen und

[40:00] das ist eben A-F, 0-9 und dahinter dann in geschweifenen Klammern die genaue Anzahl.

[40:06] Und in meinem Fall waren es dann halt einmal 8 Zeichen, minus 4 Zeichen, minus 4 Zeichen,

[40:11] minus 4 Zeichen, minus 12 Zeichen.

[40:12] So war die in meiner Datei aufgebaut.

[40:14] Der Ausdruck ist also schon etwas länger, der ist aber ziemlich einfach, weil es ist

[40:18] immer das gleiche Muster, nur mit Bindestrichen und einem Quantifizierer abgetrennt.

[40:22] Und so konnte ich dann exakt die UUIDs rausfiltern und die in eine andere Datei schreiben und

[40:25] damit dann das tun, was ich tun wollte.

[40:28] So, nächstes Beispiel, bin ich schon ein paar Mal drauf rumgeritten, E-Mail-Adressen

[40:32] suchen.

[40:33] Sieht auch relativ einfach aus, eckige Klammern, A-Z, eckige Klammern zu, Plus, dann das Add,

[40:39] dann nochmal Zeichen, Plus, Backslash, Punkt und dahinter dann eben die Zeichen 2-3 Mal

[40:44] für die Top-Level-Domain.

[40:45] Hatten wir jetzt schon ein paar Mal, gehe ich jetzt hier nochmal im Detail durch.

[40:48] Vorname-Nachname-Vertauschen ist wirklich etwas, was ich häufig habe, das habe ich

[40:51] gerade auch schon kurz erklärt.

[40:53] Der reguläre Ausdruck sieht relativ einfach aus.

[40:55] Haben wir Vorname, Leerzeichen, Nachname, dann sieht der Ausdruck so aus.

[40:59] Runde Klammer auf, Punkt, Plus, Runde Klammer zu, Leerzeichen und dann nochmal genau das

[41:05] gleiche. Runde Klammer, Punkt, Plus, Runde Klammer zu. Punkt, Plus steht für ein beliebiges

[41:10] Zeichen. Das ist der Punkt. Beliebig oft, aber mindestens einmal. Dafür das Plus. Und

[41:16] weil ich die ja jetzt gleich vertauschen will, brauche ich Gruppen, um dann darauf zugreifen

[41:20] zu können. Deswegen packe ich beide Sachen in Runde Klammern und dann kann ich das Ding

[41:25] ersetzen durch $2, $1 und dann habe ich Nachname, Vorname daraus gemacht. Dein Anwendungsfall,

[41:33] den ich auch ganz oft hatte, was weiß ich, Sourcecode mit einem komischen Editor bearbeitet,

[41:37] am Ende der Sourcecode-Zeilen blieben immer Leerzeichen stehen und das ist unschön. Das

[41:41] sollte man nicht machen. Dann kann man einfach alle Leerzeichen am Ende einer Zeile ersetzen.

[41:45] Und der reguläre Ausdruck dafür sieht so aus. Leerzeichen plus Dollar. Leerzeichen

[41:51] plus steht für Leerzeichen, beliebig oft, aber mindestens einmal und Dollarzeichen steht für

[41:55] Zeilenende. Das heißt, nur die Leerzeichen am Zeilenende sollen gefunden werden. Das ersetzt

[42:01] sich dann durch Nichts und dann habe ich alle Leerzeichen am Ende entfernt. Ganz oft habe ich

[42:07] sowas wie, ich möchte, was weiß ich, einen Artikel schreiben für den Blog oder so und da habe ich

[42:11] Aufzählungslisten drin und je nachdem, in welchem System ich gerade bin, werden die unterschiedlich

[42:15] geschrieben. Mal mit einem Sternchen, mal mit einem Minus, mal mit einem Punkt, wie auch immer. Und

[42:20] wenn ich sowas habe, dann kann ich relativ einfach für alle Zeilen, die ich gerade aufzählen will,

[42:24] mit einem simplen Ausdruck das Aufzählungszeichen davor schreiben. Ja, also stell dir vor, ich habe

[42:29] einen Texteditor auf, da sind 27 Zeilen drin und ich will jetzt vor jeder dieser Zeile meinetwegen

[42:33] ein Sternchen schreiben, weil ich in Markdown das Ding als Aufzählung habe. Dann gehe ich jetzt

[42:37] nicht durch 27 Zeilen und füge da überall ein Sternchen ein, sondern ich suche einfach nach dem

[42:40] regulären Ausdruck Dach. Und das Dach hast du schon kennengelernt, wenn das so alleine steht

[42:44] und nicht in einem Bereich, steht das für Zeilenanfang. Das heißt, ich suche nach dem

[42:48] Zeilenanfang und ersetze den durch Sternchen Leerzeichen. Und wenn ich das mache, habe ich mit

[42:54] drei Zeichen in alle 27 Zeilen ein Sternchen und ein Leerzeichen eingefügt. Also, das kriegst du

[43:00] per Hand, glaube ich, nicht so schnell hin. Wichtig bei sowas, es kommt dann immer auf deinen Editor an,

[43:05] wenn du Sonderzeichen als Ersetzung benutzt, wie zum Beispiel dieses Malzeichen, also den Asterisk,

[43:10] den ich da einfügen will, den kennst du aus regulären Ausdrucken, der hat dann eine besondere

[43:14] Bedeutung, da ist er nämlich ein Quantifizierer für 0, 1 oder mehrfach. Und je nachdem, wie dein

[43:19] Editor funktioniert, musst du dieses Sternchen beim Ersetzen eventuell auch escapen. Das heißt,

[43:24] anstatt zu schreiben, ersetze den Zeilenanfang durch Sternchen Leerzeichen, müsstest du eventuell

[43:29] schreiben, ersetze durch Backslash Sternchen Leerzeichen, weil das Sternchen sonst wieder

[43:33] interpretiert wird. Also, das kommt auf den Editor an. Manche machen das, manche nicht.

[43:37] Und als Ergebnis habe ich dann eben vor jeder Zeile meiner Textdatei ein Asterisk stehen und kann das

[43:42] Ding eins zu eins, das Markdown, irgendwohin kopieren zum Beispiel. So, was ich dann auch

[43:47] tatsächlich häufiger mal habe, gerade wenn ich so Schnittstellen programmiere in Java zum Beispiel,

[43:51] dann gibt mir vielleicht irgendwer eine Liste an Attributen, die ich dann in meine Klasse reinpacken

[43:56] soll und dann zum Beispiel als private Felder definieren soll. Dann habe ich vielleicht eine

[43:59] Liste mit auch wieder 27 Zeilen, wo dann sowas drinsteht wie Alter der Person in Jahren oder

[44:05] Farbe oder Hersteller oder ich weiß nicht was. Einfach beliebige Zeichenkeppen. Und daraus möchte

[44:10] ich jetzt in meiner IDI private Felder machen. Also aus Alter der Person in Jahren möchte ich

[44:16] machen private Integer Alter der Person in Jahren Semikolon, damit das halt eine gültige Variablen

[44:23] Deklaration wird. Und das kann ich jetzt relativ einfach machen. Ich suche einfach nach allem,

[44:27] was in der Zeile steht. Das mache ich mit Punkt Plus, beliebiges Zeichen, beliebig oft,

[44:33] aber mindestens einmal. Und das ganze Ding gruppiere ich, weil ich es gleich beim Ersetzen

[44:37] brauche. Das heißt, der reguläre Ausdruck sieht so aus. Klammer auf, Punkt Plus, Klammer zu.

[44:41] Relativ easy. Und das ersetze ich jetzt durch private Leerzeichen, Integer, Leerzeichen und

[44:48] dann $1 für die erste Gruppe, also alles, was ich in der Zeile gefunden habe, und Semikolon.

[44:54] Und dann sucht er mir den gesamten Zeileninhalt und ersetzt das durch private Integer,

[44:58] Zeileninhalt, Semikolon. Relativ einfach, auch nur ganz wenig, was ich eintippen muss und schon

[45:04] spare ich mir einen Riesenhaufen Tipperei in meiner IDI. Das Beispiel könnte ich auch anders

[45:09] lösen. Es ist nur ein Beispiel. Da muss man immer wissen, was dann schneller geht. Viele

[45:12] IDIs haben auch so einen Blockmodus. Das heißt, ich kann, wenn ich tippe, den Cursor nicht nur

[45:16] in einer Zeile zum Einfügen benutzen, sondern in mehreren. Und dann würde ich zum Beispiel in der

[45:20] IDI diesen Blockmodus aktivieren, markiere die 27 Zeilen, wo ich was vorschreiben will, tippe das

[45:25] einmal ein und die IDI gibt das automatisch überall in den 27 Zeilen ein. Das wäre eine

[45:30] Alternative dazu. Ich weiß, dass das geht, aber ein Beispiel für reguläre Ausdrücke ist das hier

[45:35] trotzdem ganz gut. Denn, wenn wir mal weiterdenken, der Blockmodus erfordert, dass man immer an der

[45:39] gleichen Stelle in der Zeile steht. Wenn die Variablen alle eine unterschiedliche Länge

[45:42] haben, weil die Namen unterschiedlich lang sind, dann geht das mit dem Blockmodus vielleicht nicht

[45:47] mehr. Und gerade beim Ende der Zeile, wo das Semikolon ja hin muss, ist es dann vielleicht

[45:51] nicht ganz so einfach, das mit dem Blockmodus zu machen in der IDI. Mit dem regulären Ausdruck

[45:54] geht das trotzdem. So, dann zum Ende noch das Komplexes, oder kompliziert ist es eigentlich nur

[45:59] komplex ist es ja nicht. Kompliziertes Beispiel und zwar mache ich ganz oft, ja zum Beispiel für

[46:03] den Block hier oder so, irgendwelche Linklisten oder irgendwas und da habe ich oft die Anforderung,

[46:07] dass ich zum Beispiel HTML und Markdown oder Textile oder Wikisyntax oder wie auch immer hin

[46:12] und her konvertieren muss. Und das kann man auch sehr einfach mit regulären Ausdrücken machen. Und

[46:17] zwar sieht der Ausdruck dann vielleicht ein bisschen komplizierter aus. Ich gehe jetzt hier

[46:19] auch nicht im Detail durch, kann es dir auf der Website mal angucken, aber im Prinzip, wenn ich

[46:23] zum Beispiel HTML-Links suche und daraus Markdown-Links machen will, dann definiere ich einfach, okay,

[46:28] in HTML sehen Links so aus, Spitze Klammer, A, href gleich und dann die URL in Anführungszeichen,

[46:34] Spitze Klammer zu, dann kommt eben wie ein Text, der da verlinkt wird und dann nochmal das schließende

[46:38] A-Tag. So, das kann ich jetzt suchen und dann suche ich einmal die URL als Gruppe und einmal

[46:43] den Text als Gruppe, sodass ich also aus diesem HTML-Link die URL und die Beschreibung oder den

[46:48] Titel halt eben extrahieren kann. Und dann ersetze ich das einfach durch die Markdown-Syntax und

[46:54] benutze $2 und $1 an der Stelle, wo die URL oder der Titel halt hin soll. Und so kann ich tatsächlich

[46:59] auf Knopfdruck aus allen HTML-Links Markdown-Links machen. Oder auch umgekehrt. Oder ich mache

[47:04] Markdown zu Texteilen oder wie auch immer. Also genau für solche Transformationen ist es sehr

[47:10] einfach, mal eben schnell den Regex zu schreiben und dann ist das mit einem Klick quasi gesucht

[47:14] und ersetzt. So, das waren jetzt erstmal alle Beispiele. Kannst du dir nochmal im Detail auf

[47:19] der Website angucken, in den Shownotes. Da habe ich dir nochmal mit der genauen Syntax dargestellt,

[47:23] kannst dir mal in Ruhe durchschauen und versuchen, das zu verstehen. So, bevor wir jetzt gleich hier

[47:29] zumachen, haben wir nochmal einen kurzen Ausblick, wo du vielleicht reguläre Ausdrücke nicht für

[47:34] benutzen solltest. Und ein Beispiel, was ich gerade genannt habe, gehört schon dazu. Und zwar HTML

[47:39] auseinandernehmen. Wenn du auf die Idee kommst, HTML mit regulären Ausdrücken zu durchsuchen oder zu

[47:44] ersetzen oder sonst irgendwas, dann ist das eine ganz, ganz schlechte Idee. Ich habe dir auch einen

[47:48] schönen Artikel verlinkt, wo das genau erklärt wird, warum das eine schlechte Idee ist. Ganz

[47:52] kurz zusammengefasst. Reguläre Ausdrücke sind nicht dafür geeignet, Sprachen zu parsen wie

[47:57] HTML. Es gibt die sogenannte Chomsky-Hierarchie. Die habe ich auch in den Shownotes verlinkt. Die

[48:04] kannst du dir mal angucken. Und ja, wenn man so will, werden so Sprachen so ein bisschen eingegliedert

[48:08] in ganz einfache Sprachen bis hin zu komplizierten Sprachen. Was auch immer das jetzt heißt, das führt

[48:12] jetzt hier zu weit. Das will ich nicht auseinandernehmen. Auf jeden Fall arbeiten reguläre

[48:16] Ausdrücke auf einer Ebene und HTML arbeitet auf einer höheren Ebene. Das heißt, du kannst mit

[48:21] regulären Ausdrücken HTML nicht auseinandernehmen. Ein ganz einfaches Beispiel. Angenommen, du suchst

[48:26] irgendwelche Tags und den passenden schließenden Tag dazu. Das muss in HTML ja immer so sein. So

[48:32] was kannst du mit regulären Ausdrücken nicht exakt abbilden. Dafür sind die nicht gedacht. Das

[48:37] funktioniert dort einfach nicht. Wenn du jetzt auf die Idee kommst, das zu tun, solltest du das

[48:41] sein lassen und stattdessen einfach ein HTML-Parser nehmen. Dafür sind die gebaut. Und XML ist das

[48:45] gleiche. HTML, XML. Das nimmt man nicht mit regulären Ausdrücken auseinander, sondern mit

[48:49] einem entsprechenden Parser. Mein Beispiel von eben aus HTML links markdown machen. Das funktioniert.

[48:55] Ja, und für mein simples Beispiel und in einer Textdatei, die ich unter meiner Kontrolle habe

[49:00] und wo ich weiß, dass alles korrekt ist, da kann ich das auch machen. In einem Programm, was fehlerfrei

[49:04] funktionieren muss mit beliebigen Eingaben, darfst du bitte nicht HTML mit regulären Ausdrücken

[49:08] auseinandernehmen. Das funktioniert nicht. Dafür brauchst du einen Parser. Bringt aber auch ja jede

[49:13] Promisprache eigentlich mit. Von daher sollte das kein Problem sein. Und zweites Problem. Reguläre

[49:17] Ausdrücke können relativ teuer werden. Denn wie funktionieren die Dinger? Ich habe gerade schon gesagt,

[49:22] das ist quasi eine eigene Sprache. Und reguläre Ausdrücke werden in einen Zustandsautomaten

[49:27] überführt, der dann den Text auseinander nimmt. Und das ist relativ aufwendig. Auch wenn die

[49:33] Muster vielleicht relativ einfach aussehen. Was dahinter steckt, da muss der Rechner ganz schön

[49:37] viel leisten quasi. Und wenn du jetzt also performancekritische Anwendungen baust, wo es

[49:41] auf jeden Millisekunden ankommt quasi, dann solltest du vielleicht lieber nicht

[49:45] reguläre Ausdrücke benutzen. Weil, wie gesagt, die sind ziemlich teuer im Vergleich zu normalen

[49:49] Suchen und Ersetzen zum Beispiel. Oder zu, keine Ahnung, mit Substrings in irgendwelche Strings rein

[49:55] friemeln. Das ist tausendmal performanter als ein regulärer Ausdruck. Ich habe auch noch mal

[49:59] einen schönen Artikel verlinkt. Stackoverflow, die Seite kennst du bestimmt. So die Nummer 1 für

[50:04] Softwareentwickler, wenn du nach irgendwas suchst. Und die hatten tatsächlich mal eine Downtime, weil

[50:09] ein regulärer Ausdruck die Seite zum Absturz gebracht hat, weil der so teuer war, dass alle

[50:14] Rechner sich zu Tode gerechnet haben. Also das ist ein reelles Problem in der Praxis und das

[50:19] kannst du dir gerne mal durchlesen. Ist schon ein paar Jährchen her, dass das passiert ist, aber das fand ich ein

[50:22] schönes plakatives Beispiel dafür, dass man nicht alles mit regulären Ausdrücken lösen sollte. Wie

[50:27] gesagt, denk an den goldenen Hammer. Reguläre Ausdrücke sind cool, aber sind nicht die Lösung

[50:31] für alles. Also HTML, XML auseinandernehmen und performancekritische Sachen lieber nicht mit

[50:37] regulären Ausdrücken machen. So, dann noch mal eine ganz kurze Liste an Programmen, die vielleicht,

[50:43] ohne dass du es weißt, reguläre Ausdrücke unterstützen. Wenn du mal darauf achtest, wirst du

[50:47] feststellen, dass so gut wie jeder vernünftige Texteditor reguläre Ausdrücke unterstützt. Auch alle

[50:52] möglichen Kommandozeilen und IDEs insbesondere, die unterstützen das auch. Also Kommandozeile,

[50:56] die Bash zum Beispiel oder die PowerShell, die unterstützen alle reguläre Ausdrücke. Die

[51:01] PowerShell zum Beispiel mit dem Commandlet SelectString oder die Bash zum Beispiel mit

[51:06] GREP. GREP ist so das Standard-Tool, um nach regulären Ausdrücken in Dateien zu suchen. Dann

[51:10] Editoren, der VI natürlich, Notepad++, Visual Studio Code, Atom, was auch immer,

[51:16] Emacs natürlich. Also alle guten Texteditoren unterstützen Suchen und Ersetzen mit regulären

[51:21] Ausdrücken. Und IDEs, Eclipse, IntelliJ für Java oder Visual Studio oder ich weiß es nicht, PHP

[51:27] Storm oder was es noch so gibt, die werden alle reguläre Ausdrücke unterstützen. Also wenn du

[51:32] dieses Werkzeug beherrscht, bist du unabhängig von irgendeinem konkreten Texteditor, weil die

[51:36] regulären Ausdrücke funktionieren überall gleich. Du musst sie nur einmal lernen und dann kannst

[51:40] du sie in beliebigen Editoren, IDEs, Shells, wie auch immer, verwenden. Das zeigt noch mal,

[51:45] dass es so ein verbreitetes Tool ist, dass du das unbedingt lernen solltest, meiner Meinung nach.

[51:51] Und damit das auch funktioniert, habe ich, wie gesagt, ein paar Links zusammengetragen. Die

[51:56] kannst du gerne noch mal durchlesen. Da gehe ich jetzt nicht alle im Detail durch. Und in Kapitel

[51:59] 10, zumindest in der aktuellen Ausgabe, des IT-Handbuchs für Fachinformatiker von Sascha

[52:03] Kersken, hat er auch eine mehrseitige Einführung in reguläre Ausdrücke mit Java und Python als

[52:10] Programmiersprachen. Von daher sehr praxisnah, mit schönen Beispielen und auch wirklich im Detail

[52:14] erklärt. Also wenn du das sowieso liest, was ich hoffe, wenn du IT-Azubi bist, dann guck dir das

[52:19] Kapitel doch mal an. Da ist eine schöne Einführung in das Thema reguläre Ausdrücke mit genauer

[52:23] Syntax, mit Beispielen und wie man es in der Programmierung anwendet. Also besser geht es

[52:27] eigentlich nicht. Von daher brauche ich gar kein zusätzliches Buch empfehlen. Nimm einfach das,

[52:30] was du sowieso schon hast, das IT-Handbuch und guck es dir da an. So, damit mache ich jetzt mal zu.

[52:36] Ich habe schon über 50 Minuten, das ist auch mein Herzensthema. Wie gesagt, ich habe es am Anfang

[52:40] gesagt, ich kann es nur empfehlen. Guck dir das an, reguläre Ausdrücke, super Tool und du kannst

[52:45] es an sehr vielen Stellen verwenden. Und wenn du es erstmal beherrschst, werden dir auch immer noch

[52:48] mehr Stellen auffallen, wo du es tatsächlich einsetzen kannst. Von daher schnapp dir das Buch,

[52:52] guck dir das an, übe das mal und ich habe auch noch ein paar Links auf der Website, wie gesagt,

[52:56] itberufepodcast.de. Da findest du das alles, da findest du meine Beispiele und auch die Links zu

[53:02] zwei super Websites, wo, wenn du einen regulären Ausdruck eingibst, der wirklich bis auf die

[53:06] einzelnen Zeichen auseinandergenommen wird, mit Farben hinterlegt wird und so weiter,

[53:10] was die heißen. Besser kannst du reguläre Ausdrücke eigentlich gar nicht lernen. Von

[53:14] daher, schau da gerne mal vorbei. Und ich würde mich freuen, wenn du mir auch ein Feedback gibst,

[53:17] wofür du reguläre Ausdrücke einsetzt oder hast du noch nie was von denen gehört. Auch dann würde

[53:21] es mich freuen, wenn du mich informierst. Schick mir eine Mail oder schreib mir eine E-Mail über das

[53:25] Kontaktformular oder such mich bei Twitter, Facebook, LinkedIn, wie du willst. Hauptsache,

[53:29] ich höre von dir. Würde mich freuen. So, damit mache ich heute mal den Laden zu.

[53:34] Ich sage vielen Dank für die Aufmerksamkeit und bis zum nächsten Mal. Tschüss!

Polyglot Clean Code Developer
About the Author
Ausbildungsleiter für Fachinformatiker:innen Anwendungsentwicklung, IHK-Prüfer und ehemaliger Hochschuldozent für Programmierung und Software-Engineering.

2 comments on “Reguläre Ausdrücke – IT-Berufe-Podcast #160”

  1. Michel sagt:

    Schöner Einstieg ins Thema, hätte nicht gedacht dass das in einen Podcast so möglich ist, Respekt!

    Ich verwende oft noch die vordefinierten Zeichenklassen \s und \w bzw. deren Umkehrung \S und \W.

  2. Stefan Macke sagt:

    Hallo Michel, das freut mich, danke! Deine Ergänzungen finde ich auch spannend. Die genannten, insb. \s, nutze ich auch sehr oft. Ich musste nur irgendwo die Grenze für die Episode ziehen. Danke für den Hinweis!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert