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 2
Hilfsfunktionen: 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:00
Merke
- 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
Aufgabe
Schreibe eine Funktion, die aus einem Text alle Zahlen extrahiert und deren Summe berechnet.