Hledání v textu
Píše děda Josef ve vzkazu něco o dešti? Kde v textu začíná určité slovo? Metoda find hledá v textu jiný text. Vrátí dvě čísla: pozici, kde nalezený text začíná, a pozici, kde končí. Když tam text není, vrátí nil:
local vzkaz = "Hugo chce 12 jahod"
print(vzkaz:find("jahod", 1, true))
print(vzkaz:find("mrkev", 1, true))Vypíše:
14 18
nilCo znamenají 1 a true? Číslo říká, odkud hledat: od prvního znaku. true říká, že hledáte přesně ten text, který jste napsali. Bez něj bere find hledaný text jako vzor, ve kterém mají některé znaky zvláštní význam. Vzory poznáte později v této lekci; zatím jeden příklad. Tečka ve vzoru znamená „jakýkoli znak“, takže find(".") najde hned první znak, ať je jakýkoli:
local cena = "Cena: 3.50"
print(cena:find(".", 1, true))
print(cena:find("."))Vypíše:
8 8
1 1Když hledáte přesný text, přidávejte proto vždy 1, true. U samotných písmen, třeba "jahod", by hledání fungovalo i bez nich, ale s tečkou, závorkou nebo znakem procenta už ne.
V podmínce se nil počítá jako nepravda a každé číslo jako pravda. find proto můžete dát rovnou do if a zjistit, jestli text obsahuje jiný text:
local pocasi = "Zataženo, večer déšť"
if pocasi:find("déšť", 1, true) then
print("Zavřete slepice do kurníku")
endVypíše:
Zavřete slepice do kurníkufind rozlišuje velká a malá písmena: v textu "Déšť celý den" slovo "déšť" nenajde. Když na velikosti nezáleží, hledejte v textu převedeném na malá písmena: pocasi:lower():find("déšť", 1, true). (Jen pozor, lower nezmění velká písmena s diakritikou, třeba Č. Proč, uvidíte později v této lekci.)
Pozice, které vrátí find, se hodí pro sub. Takhle rozdělíte text na dvě části u dvojtečky:
local zaznam = "Bella: 18 litrů"
local dvojtecka = zaznam:find(":", 1, true)
print(zaznam:sub(1, dvojtecka - 1))
print(zaznam:sub(dvojtecka + 2))Vypíše:
Bella
18 litrůKdyž výsledek find uložíte do jedné proměnné, dostanete první číslo, začátek; druhé se zahodí. Pro obě napište dvě proměnné, local zacatek, konec = zaznam:find(":", 1, true), jako u každé funkce, která vrací dvě hodnoty.
Častá chyba: použít pozici, aniž byste ji zkontrolovali. Když v textu dvojtečka není, je v proměnné dvojtecka hodnota nil a dvojtecka - 1 program ukončí:
local zaznam = "Bella 18 litrů"
local dvojtecka = zaznam:find(":", 1, true)
print(zaznam:sub(1, dvojtecka - 1))main.lua:3: attempt to perform arithmetic on a nil value (local 'dvojtecka')Když si nejste jistí, že tam hledaný text je, zkontrolujte výsledek nejdřív pomocí if.
Jak psát:
Pokyny
Chce Hugo dýně? A brambory? Zjistěte obojí pomocí find a if: hledejte texty "dýní" a "brambor". Vypište:
Dýně: ano
Brambory: neEma chce na tabuli napsat jen objednávku, bez zbytku vzkazu. Najděte pomocí find první tečku a vypište vzkaz až po ni, i s tečkou:
Potřebuji 12 dýní a 30 mrkví.Potom vypište zbytek vzkazu, který začíná dva znaky za tečkou (mezi nimi je mezera): Přijedu v pátek.
Začněte programovat zdarma
3/9