Kurz: Lua hat statt regulärer Ausdrücke eigene, einfachere Muster. Sie reichen für die meisten Aufgaben.
Teil des Kurses Lua
Muster (Patterns)
Lua hat statt regulärer Ausdrücke eigene, einfachere Muster. Sie reichen für die meisten Aufgaben.
| Muster | Bedeutung |
|---|---|
. | beliebiges Zeichen |
%a %d %s %w %p | Buchstabe, Ziffer, Leerraum, alphanumerisch, Satzzeichen |
%A %D %S … | jeweils das Gegenteil |
[abc] [^abc] [a-z] | Zeichenklassen |
* + - ? | 0 oder mehr (gierig), 1 oder mehr, 0 oder mehr (genügsam), 0 oder 1 |
^ $ | Anfang, Ende |
( ) | Gruppe (Capture) |
% | Maskierung (%. ist ein Punkt, %% ein Prozentzeichen) |
local text = "Mia (17) wohnt in 10115 Berlin, Tom (25) in 20095 Hamburg."
print(string.find(text, "Berlin")) -- Start- und Endposition
print(string.find(text, "%d+")) -- erste Zahl
print(string.match(text, "%((%d+)%)")) -- Capture: 17
print(string.match(text, "(%a+) %((%d+)%)")) -- Name und Alter
print(string.match("2025-03-15", "(%d+)-(%d+)-(%d+)"))
print((string.gsub(text, "%d%d%d%d%d", "#####"))) -- ersetzen
print(string.gsub("hallo welt", "%w+", string.upper))
print(string.gsub("a b c", " ", "_", 1)) -- höchstens 1 Ersetzung
print(string.gsub("Hallo", "(%a)(%a*)", "%2%1")) -- Rückbezug auf Captures
print(string.gsub("$name ist $alter", "%$(%w+)", {name = "Mia", alter = 17}))
for wort in string.gmatch("eins zwei drei", "%S+") do io.write("[", wort, "]") end
print()
for k, v in string.gmatch("a=1, b=2, c=3", "(%w+)=(%w+)") do io.write(k, "->", v, " ") end
print()
print((" Text "):match("^%s*(.-)%s*$") .. "|") -- trimmen
print(("a,b,,c"):find(",", 1, true)) -- true = einfache Suche ohne MusterAusgabe:
25 30
6 7
17
Mia 17
2025 03 15
Mia (17) wohnt in ##### Berlin, Tom (25) in ##### Hamburg.
HALLO WELT 2
a_b c 1
alloH 1
Mia ist 17 2
[eins][zwei][drei]
a->1 b->2 c->3
Text|
2 2Hilfsfunktionen: split, join, trim
local function split(s, trenner)
local teile = {}
for stueck in (s .. trenner):gmatch("(.-)" .. trenner:gsub("%p", "%%%0")) do
teile[#teile + 1] = stueck
end
return teile
end
local function trim(s) return (s:gsub("^%s+", ""):gsub("%s+$", "")) end
local function beginnt_mit(s, p) return s:sub(1, #p) == p end
local function titel(s) return (s:gsub("(%a)(%w*)", function(a, b) return a:upper() .. b:lower() end)) end
local teile = split("a,b,,c", ",")
print(#teile, table.concat(teile, "|"))
print("[" .. trim(" hallo ") .. "]")
print(beginnt_mit("Lua lernen", "Lua"), titel("dER kleine pRINZ"))
print(table.concat({1, 2, 3}, "-"), ("x"):rep(3, ","))
print(("Hallo"):byte(1, -1))
print(("%d Äpfel für %.2f Euro"):format(3, 4.5))
print(#"Grüße", utf8.len("Grüße"), utf8.char(228, 8364))
print(os.time({year = 2025, month = 3, day = 15, hour = 12}) - os.time({year = 2025, month = 3, day = 14, hour = 12}))
print(os.date("!%Y-%m-%d %H:%M", 86400 * 365))Ausgabe:
4 a|b||c
[hallo]
true Der Kleine Prinz
1-2-3 x,x,x
72 97 108 108 111
3 Äpfel für 4.50 Euro
7 5 ä€
86400
1971-01-01 00:00Merke
- Muster mit
%d %a %s %w, Quantoren* + - ?, Captures( ) find(Position),match(Treffer/Captures),gmatch(Schleife),gsub(Ersetzen)- Zeichen mit
%maskieren;find(..., 1, true)sucht ohne Muster - Strings sind Bytefolgen;
utf8-Bibliothek für Unicode
Übungsaufgabe
Schreibe eine Funktion, die aus einem Text alle Zahlen extrahiert und deren Summe berechnet.
Quiz zur Selbstkontrolle
Wofür steht %d im Muster?
- Eine Ziffer (richtig)
- Einen Punkt
- Ein Datum
- Ein Zeichen
Was liefert gmatch?
- Einen Iterator über alle Treffer (richtig)
- Einen Boolean
- Eine Tabelle
- Die Anzahl der Treffer
Wie maskiert man ein Sonderzeichen in einem Muster?
- Mit % (richtig)
- Mit \
- Mit #
- Mit $
Weiter im Kurs
Zurück: Tabellen
Weiter: Metatabellen und Objektorientierung
Alle Kapitel: Lua im Überblick