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.

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:

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

Polyglot Clean Code Developer
About the Author
Ausbildungsleiter für Fachinformatiker Anwendungsentwicklung und Systemintegration, IHK-Prüfer und 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

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax