Vzory
S find a 1, true hledáte přesný text. Často ale text neznáte, víte jen, jak vypadá: „nějaké číslo“, „slovo za slovem Prodáno“. Na to má Lua vzory (anglicky patterns): texty, ve kterých mají některé znaky zvláštní význam. (Mnoho jazyků na to má regulární výrazy. Vzory v Lua jsou jejich menší a jednodušší příbuzní: pokud regulární výrazy znáte, nehledejte tu | ani \d.)
Metoda match vrátí první část textu, která vzoru odpovídá, nebo nil, když žádná neodpovídá. Nejužitečnější části vzorů jsou třídy znaků, z nichž každá zastupuje jeden znak určitého druhu:
%d: číslice od 0 do 9;%a: písmeno od a do z, malé i velké;%w: písmeno nebo číslice;%s: mezera (nebo tabulátor či konec řádku);.: jakýkoli znak.
Velké písmeno znamená opak: %D je cokoli kromě číslice, %S cokoli kromě mezery. Za třídou řeknete, kolik takových znaků chcete: + jeden nebo víc, co nejvíc; * žádný nebo víc, co nejvíc. Bez nich třída znamená právě jeden znak:
local zapis = "Slepice snesly 18 vajec"
print(zapis:match("%d+"))
print(zapis:match("%a+"))
print(zapis:match("%d"))
print(zapis:match("%d+%s*%a+"))Vypíše:
18
Slepice
1
18 vajecPoslední vzor čtěte „číslice, případně nějaké mezery, písmena“. * za %s dovolí i žádnou mezeru, takže by vzor našel i 18vajec.
Dva znaky přivážou vzor ke krajům textu: ^ na začátku vzoru znamená, že shoda musí začínat na začátku textu, a $ na konci vzoru, že musí končit na konci textu. S oběma musí vzoru odpovídat celý text. Takhle zjistíte, jestli je text celé číslo:
print(("42"):match("^%d+$"))
print(("42 vajec"):match("^%d+$"))Vypíše:
42
nilVětšinou ale nechcete celou shodu, jen několik jejích částí. Ty části vzoru dejte do závorek, takzvaných zachycení (anglicky captures), a match vrátí jen je, jednu hodnotu za každý pár závorek:
local zaznam = "Prodáno 24 vajec"
local pocet, zbozi = zaznam:match("Prodáno (%d+) (%a+)")
print(zbozi, pocet)
print(tonumber(pocet) * 2)Vypíše:
vajec 24
48Části vzoru mimo závorky, tedy Prodáno a mezery, v textu být musí, ale nevrátí se. Zachycené hodnoty jsou vždy texty, i "24", takže čísla převeďte pomocí tonumber. A když text vzoru neodpovídá, vrátí match jen nil, takže pocet i zbozi budou nil: než je použijete, zkontrolujte je.
Znakům se zvláštním významem, ( ) . % + - * ? [ ] ^ $, se říká magické znaky. Když jeden z nich hledáte jako obyčejný znak, dejte před něj %: %. je tečka, %( závorka:
print(("Cena: 3.50 mince"):match("%d+%.%d+"))Vypíše:
3.50A zase diakritika. %a a %w znají jen písmena od a do z, takže shoda skončí před prvním písmenem s háčkem nebo čárkou:
print(("dýně"):match("%a+"))Vypíše:
dPro slova, která můžou mít diakritiku, použijte %S+: všechny znaky až po další mezeru (i interpunkci, takže čárka hned za slovem bude jeho součástí).
Jak psát:
Pokyny
Nahraďte print v cyklu: z každé poznámky vytáhněte jedním match se třemi zachyceními počet, zboží a mince. Zboží zachyťte pomocí %S+, protože %a písmena s diakritikou nezná. Poznámka o dešti vzoru neodpovídá: přeskočte ji. U každého prodeje vypište cenu za kus (dělte pomocí //, aby vyšlo celé číslo):
12 dýní po 20 mincích
30 mrkví po 5 mincíchPod cyklus vypište, kolik mincí Ema za všechny prodeje dohromady dostala: Celkem: 390 mincí.
Začněte programovat zdarma
6/9