Procházení shod

match najde jen první shodu. Když chcete projít všechny, použijte gmatch (g jako global, všude) v cyklu for, podobně jako ipairs. Každý průchod cyklem dostane další část textu, která vzoru odpovídá:

local vejce = "Vejce za týden: 12 9 14 11"
local celkem = 0
for cislo in vejce:gmatch("%d+") do
    celkem = celkem + tonumber(cislo)
end
print("Celkem: " .. celkem)

Vypíše:

Celkem: 46

Když má vzor zachycení, má cyklus proměnnou pro každé z nich:

local sklad = "mrkev=24,brambory=8,jahody=3"
for nazev, pocet in sklad:gmatch("(%a+)=(%d+)") do
    print(nazev .. ": " .. pocet)
end

Vypíše:

mrkev: 24
brambory: 8
jahody: 3

Samotné gmatch shody nevrací; vrátí funkci, kterou cyklus for volá pro další shodu. Smysl má proto jen v cyklu: print(sklad:gmatch("%d+")) vypíše jen function: 0x…, adresu té funkce.

Tady se hodí další dvě části vzorů. Množina v hranatých závorkách zastupuje jeden znak z výčtu: [aeiou] je samohláska, [%d.] číslice nebo tečka (třídy fungují i uvnitř množiny). Se ^ na začátku znamená množina opak: [^,] je jakýkoli znak kromě čárky. [^,]+ je tedy „všechno až po další čárku“, obvyklý způsob, jak rozdělit seznam hodnot:

local plodiny = "mrkev,brambory,cukrová řepa"
for plodina in plodiny:gmatch("[^,]+") do
    print(plodina)
end

Vypíše:

mrkev
brambory
cukrová řepa

Na rozdíl od %a+ nemá množina problém s mezerou ani s diakritikou v „cukrová řepa“. Podívejte se, co v takovém seznamu udělá %a+ s diakritikou. Chybou neskončí, položku prostě potichu vynechá:

local sklad = "mrkev=24,dýně=5"
for nazev, pocet in sklad:gmatch("(%a+)=(%d+)") do
    print(nazev .. ": " .. pocet)
end

Vypíše:

mrkev: 24

Těsně před = je ě, přes které vzor neprojde, a tak dýně ve výpisu chybí, aniž by vás na to cokoli upozornilo.

A poslední znak pro opakování: -, žádný nebo víc, ale co nejméně. .* vezme, co může, .- se zastaví, jakmile sedí zbytek vzoru. Rozdíl uvidíte u textu mezi dvěma značkami:

local text = "Hugo (obchodník) a Josef (soused)"
print(text:match("%((.*)%)"))
for role in text:gmatch("%((.-)%)") do
    print(role)
end

Vypíše:

obchodník) a Josef (soused
obchodník
soused

%( a %) jsou závorky v textu, závorky bez % jsou zachycení. S .* sahá zachycení od první otevírací závorky po poslední zavírací, s .- jen po nejbližší.

Pokyny

Projděte objednávku pomocí gmatch a každou položku vypište na samostatný řádek. Pro název použijte množinu, aby nevadila diakritika v „dýně“:

mrkev: 30
brambory: 12
dýně: 4

Ke každé položce najděte cenu v tabulce ceny a sečtěte, kolik Hugo zaplatí: počet kusů krát cena, za všechny položky. Pod cyklus vypište Hugo zaplatí 326 mincí. (Klíč ["dýně"] je v hranatých závorkách, protože název s diakritikou nejde napsat bez uvozovek.)

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

7/9