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
nil

Co 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	1

Když 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")
end

Vypíše:

Zavřete slepice do kurníku

find 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.

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

Ema 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

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

Nebo se registrujte pomocí:

3/9