Einstieg in RegEx - FrOSCon 2011

Michael Gisbers

2021-08-21

Was ist RegEx?

  • RegEx -> RegExp -> Regular Expressions -> Reguläre Ausdrücke
  • flexible Möglichkeit in Daten zu suchen.
  • Erfunden in den 1960ern von Ken Thompson für qed einen Vorgänger von ed
  • Später schrieb Thompson grep und benutzte RegEx dort.

Was ist RegEx?

  • Es gibt verschiedenste RegEx Dialekte
    • Basic Regular Expressions
    • Extended Regular Expressions
    • Perl Regular Expressions
    • etc.

Was ist RegEx?

  • Da Programme die RegEx auch noch unterschiedlich implementieren ist es teilweise anzugeben welchen Dialekt und nach welchem Programm man RegEx anwenden will.
  • Beispiel find. Für -regextype gibt es folgende Parameter:
    • ‘findutils-default’, ‘ed’, ‘emacs’, ‘gnu-awk’, ‘grep’, ‘posix-awk’, ‘awk’, ‘posix-basic’, ‘posix-egrep’, ‘egrep’, ‘posix-extended’, ‘posix-minimal-basic’, ‘sed’

Wie sieht RegEx aus?

  • Welches der beiden folgenden Texte stellt einen RegEx dar?
    • root
    • r??t
    • r[oO]{2}t

Wann ist ein RegEx ein RegEx?

  • Beispiel 1:
    • ‘root’ ist erstmal nur ein Text, wird aber automatisch zu einem RegEx, wenn er durch einen Interpreter geschickt wird, der RegEx versteht. In dem Fall werden die Literale (r o o t) in der Reihenfolge hintereinander gesucht.

Wann ist ein RegEx ein RegEx?

  • Beispiel 2:
    • ‘r??t’ kann sowohl ein Text, aber auch ein Globbing innerhalb der Shell sein. Daneben ist es mit einem RegEx Interpreter genutzt die Suche nach dem Literal ‘r’, das 0 oder 1-mal vorkommt, einem ungenutzten Quantifier (‘?’) und dem Literal ‘t’.

Wann ist ein RegEx ein RegEx?

  • Beispiel 3:
    • ‘r[oO]{2}t’ sticht jedem als ein möglicher RegEx ins Auge, ist aber erst ein RegEx sobald auch ein entsprechender Interpreter genutzt wird.

Nutzung von RegEx mit grep

Eines der häufig genutzten Programme um Texte aus Dateien zu filtern ist grep.

user@linux $ grep 'root' /etc/passwd

Es werden alle Zeilen ausgegeben, die den Text ‘root’ beinhalten. Die Ausgabe kann mit dem Parameter -v umgekehrt werden.

Nutzung von RegEx mit grep

Ohne weitere Parameter benutzt grep den Dialekt Basic Regular Expression.

Ebenso sollte man statt der Aufrufe egrep oder fgrep die Parameter -E oder -F nutzen.

Nutzung von RegEx mit grep

Somit sieht der Aufruf nun wie folgt aus:

user@linux $ grep -E 'root' /etc/passwd

Qualifier

  • Qualifier definieren die gesuchten Zeichen.
  • Ein Qualifier ist immer genau ein Zeichen lang.

Qualifier

a Literal, ein einzelnes Zeichen
. ein beliebiges Zeichen (auch ein .)
\. Escape für Sonderzeichen. Der ‘.’ wird als solches gesucht
[abcABC] Zeichengruppe, eines der in der Gruppe aufgeführten Zeichen
[^abcABC] negierte Zeichengruppe, keines der in der Gruppe aufgelisteten Zeichen
[[:alpha:]] Zeichenklasse, kann nur innerhalb einer Zeichengruppe genutzt werden.

Zeichengruppen

  • In Zeichengruppen können einzelne Zeichen benutzt werden.
  • Ranges wie ‘0-9’, ‘a-z’ oder ‘a-Z’ können genutzt werden.
  • Das Zeichen ‘-’ muss am Anfang oder Ende der Zeichengruppe stehen.
  • Das Zeichen ‘]’ muss am Anfang der Zeichengruppe stehen.
  • Es können auch mehrere Ranges oder Zeichenklassen innerhalb einer Zeichengruppe genutzt werden.

Erweiterungen

\w word character - Zeichen, Ziffer und _
\W non- word character - Zeichen das von \w nicht gematched wird.
\b word -boundary - matched an Wort - Grenzen
\B non- word-boundary - matched an nicht - Wort - Grenzen
\s spac es - Leerzeichen, Tabulator, Zeilenumbruch
\S non- spaces - kein Leerzeichen, Tabulator, Zeilenumbruch

Quantifier

  • Quantifier stehen direkt hinter dem Zeichen, der Zeichengruppe oder einer Gruppe.
  • Quantifier ohne vorherige Qualifier oder nach einem Quantifier werden in der Regel ignoriert.

Quantifier angeben

{n} genau n - mal
{n,m} mindestens n - mal , maximal m - mal
{n,} mindestens n - mal

Quantifier Makros

? {0,1}
+ {1,}
* {0,}

Gruppierungen

In runde Klammern ‘()’ eingeschlossene RegEx werden als Gruppe gesehen. Ein auf die Gruppe folgender Quantifier gilt für die gesamte Gruppe.

Mit einen ‘|’ kann innerhalb der Gruppe eine oder-Verknüpfung vorgenommen werden ‘(ab|bcd)’.

Die durch die Gruppierungen gematchten Zeichen werden in einen Zwischenspeicher gelegt und können über eine ‘backreference’ wieder ausgelesen werden. ‘(ab)\1’.

Unterschiede zwischen Basic und Extended Regex

  • Basic Regex ist veraltet (obsolete) und sollte nicht mehr genutzt werden.
  • Die Zeichen |, +, ?, {, }, (, ) müssen bei Basic Regex escaped (\) werden.
  • Bei Extended Regex müssen die Zeichen nur escaped werden, wenn das Zeichen selber gemeint ist.

Anker

  • Verankerungen sind am Zeilenanfang (^) und am Zeilenende ($) möglich.

Greedy - gierig

  • Regex ist gierig
  • Es wird soviel wie möglich zu matchen
  • Es wird nur soweit gematched, dass der weitere Regex matchen kann

Beispiele zu grep

sed - Stream Editor

  • über den sed können Datenströme und Dateien verändert werden.
  • Substitute (s/suchen/ersetzen/parameter) ist der meist genutzte Befehl
  • Häufig genutzte Parameter für substitute:
    • i - Groß- Kleinschreibung ignorieren
    • g - substitute mehrfach anwenden, nicht nur auf den ersten Match
    • p - bei einem Match ausgeben, zusammen mit dem Parameter -n

sed - Bereich festlegen

n Zeile n
n,m Zeile n bis m
n,+m Zeile n und die nächsten m - Zeilen
/regex/ Zeilen auf die der Regex passt, kann statt n und m genutzt werden

Hinter dem Bereich kann mit dem Befehl p die Ausgabe oder mit s/// ein substitute gemacht werden.

sed - Befehle

p Match ausgeben
d Match löschen
s/// Match ersetzen (substitute)
c text Match durch text ersetzen
a text Text an den Match anhängen
i text Text vor dem Match einfügen

sed - Parameter

-i inplace - die angegebene Datei verändern
-n nur Zeilen die per p oder anderen ausgebenden Kommandos gedruckt werden ausgeben
-E Umschalten auf Extended Regex (sonst Basic Regex)
-e script Script ausführen, mehrfach nutzbar
-f file Script aus Datei lesen

Beispiele zu sed

Regex spielerisch

https://regexcrossword.com

Vielen Dank

Fragen bitte in den Chat, oder per Mail an

michael@gisbers.de

Matrix: @mgisbers:matrix.dynlinux.io

Mastodon: mgisbers@dynlinux.io