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: 46Když 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)
endVypíše:
mrkev: 24
brambory: 8
jahody: 3Samotné 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)
endVypíše:
mrkev
brambory
cukrová řepaNa 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)
endVypíše:
mrkev: 24Tě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)
endVypíš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žší.
Jak psát:
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ě: 4Ke 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
7/9