EMZETT.
Login

Kurz: Lua hat statt regulärer Ausdrücke eigene, einfachere Muster. Sie reichen für die meisten Aufgaben.

Teil des Kurses Lua

Kapitel 5 von 8 im Kurs Lua. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Muster (Patterns)

Lua hat statt regulärer Ausdrücke eigene, einfachere Muster. Sie reichen für die meisten Aufgaben.

MusterBedeutung
.beliebiges Zeichen
%a %d %s %w %pBuchstabe, 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 Muster

Ausgabe:

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

Übungsaufgabe

Schreibe eine Funktion, die aus einem Text alle Zahlen extrahiert und deren Summe berechnet.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Tabellen

Weiter: Metatabellen und Objektorientierung

Alle Kapitel: Lua im Überblick