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 vajec

Poslední 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
nil

Vě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.50

A 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:

d

Pro 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í).

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ích

Pod cyklus vypište, kolik mincí Ema za všechny prodeje dohromady dostala: Celkem: 390 mincí.

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

6/9