Text ersetzen
Die Methode gsub (global substitution, überall ersetzen) ersetzt jeden Teil eines Textes, der zu einem Muster passt, durch einen anderen Text. Wie die anderen Zeichenkettenfunktionen verändert sie das Original nicht, sondern gibt einen neuen Text zurück. Und sie gibt noch einen Wert zurück: wie viele Ersetzungen sie vorgenommen hat.
local notiz = "Frische Eier, frische Milch"
print(notiz:gsub("frische", "FRISCHE"))Das gibt Folgendes aus:
Frische Eier, FRISCHE Milch 1Nur eine Ersetzung: Frische mit großem F ist ein anderer Text. Und nach einem Tabulator steht die Anzahl, denn print gibt jeden Wert aus, den es bekommt. Meistens willst du nur den Text. Dafür gibt es drei Wege:
local notiz = "Frische Eier, frische Milch"
print((notiz:gsub("Eier", "Äpfel")))
local besser = notiz:gsub("Milch", "Butter")
print(besser)
local laut, anzahl = notiz:gsub("frische", "FRISCHE")
print(laut, anzahl)Das gibt Folgendes aus:
Frische Äpfel, frische Milch
Frische Eier, frische Butter
Frische Eier, FRISCHE Milch 1Zusätzliche Klammern um einen Aufruf behalten nur seinen ersten Wert. Auch eine Variable behält nur den ersten Wert, und mit zwei Variablen bekommst du beide. Die Klammern sind wichtig, wenn du das Ergebnis an eine andere Funktion übergibst, die sonst die Anzahl als ein weiteres Argument bekäme. Das zweite Argument von tonumber ist die Basis der Zahl (10 für gewöhnliche Zahlen), deshalb endet das hier mit einem Fehler:
local gewicht = "12 kg"
print(tonumber(gewicht:gsub(" kg", "")))main.lua:2: bad argument #2 to 'tonumber' (base out of range)Mit tonumber((gewicht:gsub(" kg", ""))) funktioniert es.
Das erste Argument ist ein Muster, alles aus den letzten beiden Übungen funktioniert also darin. Um etwas zu entfernen, ersetze es durch einen leeren Text, "". Um mehrere Leerzeichen hintereinander zusammenzuziehen, ersetze %s+ durch ein einzelnes Leerzeichen:
local notiz = "Eier: 12, Milch: 18"
print((notiz:gsub("%s+", " ")))
print((notiz:gsub("%d", "?")))Das gibt Folgendes aus:
Eier: 12, Milch: 18
Eier: ??, Milch: ??Weil es ein Muster ist, achte auf Sonderzeichen. Im Deutschen schreibst du Dezimalzahlen mit einem Komma, aber wenn du "." ersetzt, ersetzt du jedes Zeichen, denn der Punkt steht für ein beliebiges Zeichen. %. ist der Punkt selbst:
print(("3.50"):gsub(".", ","))
print(("3.50"):gsub("%.", ","))Das gibt Folgendes aus:
,,,, 4
3,50 1Auch in dem Text, der einsetzt wird, ist % etwas Besonderes: %1 setzt ein, was das erste Capture gefunden hat, %2 das zweite und so weiter. So drehst du ein Datum um:
local datum = "2026-06-14"
print((datum:gsub("(%d+)-(%d+)-(%d+)", "%3.%2.%1")))Das gibt Folgendes aus:
14.06.2026Auch die Anzahl ist für sich nützlich. Um herauszufinden, wie oft ein Wort in einem Text vorkommt, ersetze es durch sich selbst und behalte nur die Anzahl: local _, mal = notiz:gsub("Eier", "Eier").
So schreibst du es:
Anweisungen
- 1
Opa Josef kann Kartoffeln nicht schreiben. Ersetze mit
gsubjedesKartofelndurchKartoffelnund gib die korrigierte Notiz ohne die Anzahl aus:Frische Kartoffeln und Eier! Dicke Kartoffeln für 3 Münzen. - 2
Gib mit dem zweiten Wert von
gsubaus, wie viele Wörter du korrigiert hast:Korrigiert: 2. - 3
In der Notiz stehen auch zu viele Leerzeichen. Ersetze in der korrigierten Notiz jede Folge von Leerzeichen durch ein einzelnes Leerzeichen und gib die saubere Notiz aus:
Frische Kartoffeln und Eier! Dicke Kartoffeln für 3 Münzen.