Nahrazování textu
Metoda gsub (z anglického global substitution, nahrazení všude) nahradí každou část textu, která odpovídá vzoru, jiným textem. Stejně jako ostatní funkce pro řetězce původní text nezmění, vrátí nový. A vrátí ještě jednu hodnotu: kolikrát nahrazovala.
local nabidka = "Vejce a mléko, vejce a med"
print(nabidka:gsub("vejce", "VEJCE"))Vypíše:
Vejce a mléko, VEJCE a med 1Jen jedno nahrazení: Vejce s velkým V je jiný text. A za tabulátorem je počet, protože print vypíše všechny hodnoty, které dostane. Většinou ale chcete jen text. Dostanete ho třemi způsoby:
local nabidka = "Vejce a mléko, vejce a med"
print((nabidka:gsub("med", "sýr")))
local lepsi = nabidka:gsub("mléko", "máslo")
print(lepsi)
local nahlas, pocet = nabidka:gsub("vejce", "VEJCE")
print(nahlas, pocet)Vypíše:
Vejce a mléko, vejce a sýr
Vejce a máslo, vejce a med
Vejce a mléko, VEJCE a med 1Závorky navíc kolem volání nechají jen jeho první hodnotu. Jedna proměnná si také nechá jen první hodnotu a se dvěma proměnnými dostanete obě. Na závorkách opravdu záleží, když výsledek předáváte jiné funkci, protože ta by počet dostala jako další argument. Druhý argument funkce tonumber je základ číselné soustavy (u běžných čísel 10), takže tohle skončí chybou:
local hmotnost = "12 kg"
print(tonumber(hmotnost:gsub(" kg", "")))main.lua:2: bad argument #2 to 'tonumber' (base out of range)S tonumber((hmotnost:gsub(" kg", ""))) to funguje.
Prvním argumentem je vzor, takže v něm funguje všechno z předchozích dvou cvičení. Když chcete něco odstranit, nahraďte to prázdným textem, "". Když chcete sloučit víc mezer za sebou do jedné, nahraďte %s+ jednou mezerou:
local zapis = "Vejce: 12, mléko: 18"
print((zapis:gsub("%s+", " ")))
print((zapis:gsub("%d", "?")))Vypíše:
Vejce: 12, mléko: 18
Vejce: ??, mléko: ??Protože jde o vzor, pozor na magické znaky. V češtině se desetinná místa oddělují čárkou, jenže nahrazení "." nahradí každý znak, protože tečka znamená jakýkoli znak. Samotná tečka je %.:
print(("3.50"):gsub(".", ","))
print(("3.50"):gsub("%.", ","))Vypíše:
,,,, 4
3,50 1V náhradním textu je zvláštní i %: %1 vloží to, co našlo první zachycení, %2 druhé a tak dále. Takhle převedete datum do českého pořadí:
local datum = "2026-06-14"
print((datum:gsub("(%d+)-(%d+)-(%d+)", "%3.%2.%1")))Vypíše:
14.06.2026Samotný počet se hodí také. Když chcete zjistit, kolikrát je slovo v textu, nahraďte ho jím samým a nechte si jen počet: local _, kolikrat = nabidka:gsub("vejce", "vejce").
Jak psát:
Pokyny
Děda Josef píše „brambori“ s měkkým i. Pomocí gsub nahraďte každé brambori slovem brambory a vypište opravený vzkaz, bez počtu:
Čerstvé brambory a vejce! Velké brambory za 3 mince.Vypište, kolik slov jste opravili, pomocí druhé hodnoty gsub: Opraveno: 2.
Ve vzkazu je taky moc mezer. V opraveném vzkazu nahraďte každou řadu mezer jednou mezerou a vypište čistý vzkaz:
Čerstvé brambory a vejce! Velké brambory za 3 mince.Začněte programovat zdarma
8/9