Text finden
Steht in Opa Josefs Notiz etwas über Regen? Wo beginnt ein Wort in einem Text? Die Methode find durchsucht einen Text nach einem anderen Text. Sie gibt zwei Zahlen zurück: die Position, an der der gefundene Text beginnt, und die Position, an der er endet. Ist der Text nicht vorhanden, gibt sie nil zurück:
local notiz = "Hugo will 12 Tomaten"
print(notiz:find("Tomaten", 1, true))
print(notiz:find("Karotten", 1, true))Das gibt Folgendes aus:
14 20
nilWas bedeuten die 1 und das true? Die Zahl sagt, wo die Suche beginnt: beim ersten Zeichen. true sagt, dass du genau den Text suchst, den du geschrieben hast. Ohne true behandelt find den Text als Muster, in dem manche Zeichen eine besondere Bedeutung haben. Muster lernst du später in dieser Lektion kennen; vorab ein Beispiel. In einem Muster bedeutet der Punkt „ein beliebiges Zeichen“, deshalb findet find(".") gleich das allererste Zeichen, egal welches:
local preis = "Preis: 3.50"
print(preis:find(".", 1, true))
print(preis:find("."))Das gibt Folgendes aus:
9 9
1 1Wenn du also nach einem genauen Text suchst, füge immer 1, true hinzu. Bei reinen Buchstaben wie "Tomaten" würde find auch ohne sie funktionieren, aber bei einem Punkt, einer Klammer oder einem Prozentzeichen nicht.
In einer Bedingung zählt nil als falsch und jede Zahl als wahr. Du kannst find also direkt in ein if schreiben, um zu prüfen, ob ein Text einen anderen enthält:
local wetter = "Wolkig, Regen am Abend"
if wetter:find("Regen", 1, true) then
print("Die Hühner in den Stall bringen")
endDas gibt Folgendes aus:
Die Hühner in den Stall bringenfind unterscheidet Groß- und Kleinschreibung: In "Regen den ganzen Tag" findet es "regen" nicht. Wenn die Schreibweise egal ist, durchsuche den Text in Kleinbuchstaben: wetter:lower():find("regen", 1, true).
Die Positionen, die find liefert, passen zu sub. So schneidest du einen Text am Doppelpunkt in zwei Teile:
local eintrag = "Berta: 18 Liter"
local doppelpunkt = eintrag:find(":", 1, true)
print(eintrag:sub(1, doppelpunkt - 1))
print(eintrag:sub(doppelpunkt + 2))Das gibt Folgendes aus:
Berta
18 LiterWenn du das Ergebnis von find in einer einzigen Variablen speicherst, bekommst du die erste Zahl, den Anfang; die zweite wird verworfen. Für beide schreibst du zwei Variablen, local anfang, ende = eintrag:find(":", 1, true), wie bei jeder Funktion, die zwei Werte zurückgibt.
Typischer Fehler: die Position zu benutzen, ohne sie zu prüfen. Hat der Text keinen Doppelpunkt, ist doppelpunkt gleich nil, und doppelpunkt - 1 beendet das Programm:
local eintrag = "Berta 18 Liter"
local doppelpunkt = eintrag:find(":", 1, true)
print(eintrag:sub(1, doppelpunkt - 1))main.lua:3: attempt to perform arithmetic on a nil value (local 'doppelpunkt')Wenn du nicht sicher bist, dass der Text vorhanden ist, prüfe das Ergebnis zuerst mit einem if.
So schreibst du es:
Anweisungen
- 1
Will Hugo Tomaten? Und Kartoffeln? Prüfe beides mit
findund einemifund gib aus:Tomaten: ja Kartoffeln: nein - 2
Emma will nur die Bestellung an die Tafel schreiben, ohne den Rest der Nachricht. Suche mit
findden ersten Punkt und gib die Nachricht bis zu ihm aus, den Punkt eingeschlossen:Ich brauche 12 Tomaten und 30 Karotten. - 3
Gib dann den Rest der Nachricht aus, der zwei Zeichen nach dem Punkt beginnt (dazwischen liegt ein Leerzeichen):
Ich komme am Freitag.