Rechnungsnummern in tausend Zeilen finden
Ein regulärer Ausdruck (englisch regular expression, kurz Regex) ist ein Muster, das beschreibt, wie ein Text aussehen darf. Mit ihm finden Sie zum Beispiel alle Rechnungsnummern in einer Datei mit tausend Zeilen, ohne jede Zeile zu lesen.
Das Werkzeug grep sucht solche Muster. Dieselben Muster stecken in den Suchfeldern von Editoren und in den Lexern von Compilern. In dieser Lektion schreiben Sie sie selbst und sehen, was sie nicht können.
Am Ende dieser Lektion
Notiz
Ich kann einen regulären Ausdruck schreiben und mit grep testen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Regulärer Ausdruck | ein Muster für eine Menge von Texten | [0-9]+ |
| Zeichenklasse | eine Auswahl von Zeichen für eine Stelle | [A-Z] |
| Wiederholung | ein Zeichen, das sagt, wie oft ein Baustein vorkommt | + |
| Anker | ein Zeichen für den Anfang oder das Ende einer Zeile | ^ |
| Treffer | ein Text, auf den das Muster passt | |
| Reguläre Sprache | eine Sprache, die ein regulärer Ausdruck beschreibt |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Muster besteht aus wenigen Bausteinen
Ein Buchstabe im Muster passt auf genau diesen Buchstaben. Eine Zeichenklasse wie [A-Z] passt auf einen beliebigen Großbuchstaben.
Eine Wiederholung sagt, wie oft: + heißt einmal oder öfter, * null Mal oder öfter, ? höchstens einmal. Ein senkrechter Strich | heißt „oder“. Ein Anker ^ steht für den Zeilenanfang und $ für das Zeilenende.
Die Bausteine mit je einem Beispiel
| Baustein | Bedeutung | Muster | Passt auf |
|---|---|---|---|
| [A-Z] | ein Großbuchstabe | [A-Z][0-9] | B7 |
| [0-9] | eine Ziffer | [0-9][0-9] | 42 |
| + | einmal oder öfter | [0-9]+ | 7 und 2026 |
| * | null Mal oder öfter | ab* | a und abbb |
| ? | höchstens einmal | ab? | a und ab |
| | | oder | tee|kaffee | tee und kaffee |
| ^ und $ | Anfang und Ende der Zeile | ^[0-9]+$ | nur Ziffern |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Regel von Hand, dann als Muster
# Wir pruefen Artikelnummern wie AB-123 von Hand: zwei Buchstaben, Strich, Ziffern.
nummern = ["AB-123", "A-1", "AB123", "ab-123", "AB-"]
for nummer in nummern:
ok = False
if len(nummer) >= 4 and nummer[0].isupper() and nummer[1].isupper():
if nummer[2] == "-" and nummer[3:].isdigit():
ok = True
print(nummer, ok)
# Das Muster [A-Z][A-Z]-[0-9]+ sagt dasselbe in einer Zeile.
# Aendern Sie die Liste und pruefen Sie, welche Nummern durchkommen.
Ein häufiger Fehler
Warnung
Viele denken, * heiße „irgendein Text“, wie bei der Dateisuche *.txt. In einem regulären Ausdruck wiederholt * aber den Baustein davor. ab* passt auf abbb. Für „irgendein Text“ schreiben Sie .*.
grep -E sucht Zeilen, die zum Muster passen
Der Befehl grep -E muster liest Zeilen und gibt die aus, in denen das Muster einen Treffer hat. Die Option -E schaltet die Bausteine oben ein.
Mit printf und einer Pipe geben Sie grep eigene Zeilen. Sie wissen so genau, was hineingeht, und können vorher sagen, was herauskommt.
Nummern mit Buchstabe und Ziffern
printf 'A12\nB7\nab3\nA123\nC\n' | grep -E '^[A-Z][0-9]+$'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Dieselben Treffer nur zählen
printf 'A12\nB7\nab3\nA123\nC\n' | grep -cE '^[A-Z][0-9]+$'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Betrag mit Komma ausschneiden
echo 'Rechnung 2026-10-26 Betrag 49,90' | grep -oE '[0-9]+,[0-9]{2}'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Datum ausschneiden
echo 'Rechnung 2026-10-26 Betrag 49,90' | grep -oE '[0-9]{4}-[0-9]{2}-[0-9]{2}'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Muster kann nicht zählen
Ein regulärer Ausdruck beschreibt genau die Sprachen, die ein endlicher Automat erkennt. Beide haben nur endlich viele Zustände und können sich also nur endlich viel merken.
Darum kann kein Muster prüfen, ob gleich viele a wie b vorkommen. Dazu müsste es beliebig weit zählen. Das Muster a+b+ lässt aabb und aaabb durch, ohne die Anzahl zu vergleichen.
Muster a+b+ auf vier Zeilen
printf 'ab\naabb\naaabb\nabab\n' | grep -E '^a+b+$'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Muster (ab)+ auf dieselben Zeilen
printf 'ab\naabb\naaabb\nabab\n' | grep -E '^(ab)+$'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.