Začněte skutečně ovládat PC: Používejte regulární výrazy

Každý ví, že k hledání v textovém souboru slouží zpravidla zkratka CTR+F. Pak už stačí pouze zadat nějaké slovo. Co když ale nevíte, co přesně hledáte? Co když hledáte jen vzor?

Používání počítače nespočívá pouze v hektickém pohybu ukazatele myši po obrazovce a bušení do klávesnice. V minulosti jsme vás pobídli, abyste jste se vrátili ke kořenům a začali ovládat počítač pomocí programovacích jazyků a textových příkazů. Nakonec přišla řada i na analýzu komunikace v domácí síti a její odposlech pomocí populárního analytického programu Wireshark.  

Hledáme podle vzoru

Tentokrát se stručně podíváme na regulární výrazy – mantru každého programátora a informačního analytika, který se snaží v záplavě dat najít informaci pomocí určitého vzoru.  Základní znalost regulárních výrazů však může pomoci i naprosto běžnému uživateli počítače, který potřebuje něco najít.

Regulární výraz je formule, která pomocí speciálních zástupných znaků popisuje určitý textový výraz. Nejčastěji se používá pro testování shody, vyhledávání v rozsáhlém textu a k záměně.

Pokud budete chtít v textu vyhledat slovo okurka, regulární výraz použít nemusíte, poněvadž hledáte výskyt přesné fráze – tedy šesti po sobě jdoucích znaků okurka. Regulární výraz naopak použijete tam, kde hledáte nějaký odpovídající vzor, ale neznáte jeho přesné znění. V rozsáhlém textu by to mohlo být třeba telefonní číslo. Může být pokaždé jiné, ale má stejnou strukturu.

Psaní regulárních výrazů může být pro leckoho v počátku velmi abstraktní a těžko představitelná záležitost. Právě proto je web plný editorů, kde si budete moci svůj regulární výraz rovnou otestovat na libovolném textu, který vložíte třeba ze schránky.

482701338
Testování regulárního výrazu v editoru RegExr

Velmi povedeným testovačem je třeba web RegExr. Do horního řádku můžete začít psát svůj výraz a web bude v textu níže označovat všechny výskyty, které odpovídají vzoru. Získáte tedy představu, jak to celé opravdu funguje. Vlevo pak nechybí ani základní reference všech zástupných znaků a funkce závorek. Web tedy slouží i jako jednoduchá a rychlá učebnice.

Pokud si chcete regulární výrazy procvičit, nabízí se zase učebnice RegexOne, která v každé kapitole vysvětlí jednu z funkcí regulárních výrazů a nabídne úkol, který musíte správně vyřešit.

Telefonní číslo, tedy \+[0-9]{3}\s?[0-9]{9}

Tolik tedy k úvodu a nyní už si pojďme jeden takový regulární výraz zkonstruovat. Zůstaňme rovnou u onoho telefonního čísla. Pokud bychom hledali telefonní číslo s mezinárodní předvolbou a v českém formátu, jednoduchý regulární výraz by mohl vypadat třeba takto:

\+[0-9]{3}\s?[0-9]{9}

Uf, pro naprostého začátečníka musí takový zápis vypadat jako hodně špatný vtip a nejspíše v tom neuvidí žádný systém, princip regulárních výrazů je ale přitom velmi jednoduchý. Guláš znaků výše totiž nepopisuje nic jiného než znak + následovaný třemi čísly mezinárodní předvolby, případnou mezerou a devíti znaky samotného čísla. Pojďme si tento výraz nyní rozebrat krok za krokem.

Speciální znaky +, * a ?

Budeme tedy hledat text, který má na začátku znak + následovaný několika číslicemi telefonního čísla. V regulárních výrazech však znaménko + vyjadřuje počet a udává, že se bude předchozí znak, nebo skupina znaků, vyskytovat alespoň jednou. Regulární výraz a+ tedy v textu najde všechny posloupnosti znaku a, ať už se bude jednat o a, aa, aaa nebo třeba aaaaaaaaaaa. A přesně v tomto spočívá kouzlo hledání pomocí vzorů, nikoliv přesného zadání.

280558331 
Výrazu á+ odpovídá v textu hned několik možností
 

Vedle znaku + pro alespoň jeden výskyt, nabízejí regulární výrazy ještě znaky * pro žádný, nebo libovolný výskyt a ? pro žádný, nebo jeden výskyt.

Výrazu o?kurka tedy budou odpovídat jak slova okurka, tak kurka, znak o se totiž může podle zadání vyskytovat jednou, nebo vůbec. Výrazu o*kurka by pak zase mohl odpovídat text kurka, okurka, ookurka, ooookurka a tak dále.

Zpět ale k našemu telefonnímu číslu. Jelikož hledáme opravdu znak + a nejde nám o určení opakování, musíme před něj dát zpětné lomítko \. Stejným způsobem můžeme ochránit všechny speciální znaky včetně hvězdičky, otazníku a dalších.

Hranaté závorky určí možný výčet znaků

Za znakem + následuje dvanáct číslic, které obsahují mezinárodní předvolbu a samotné telefonní číslo. Náš vzor proto pokračuje takto: \+[0-9]. Hranaté závorky vyjadřují výčet možných znaků. Pokud bych použil třeba [abc], znamená to, že se má použít znak a, b, nebo c. Abych ale nemusel vypisovat všechny možné znaky, lze v hranatých závorkách použít i rozsah [a-z]. V tomto případě jsem tedy elegantně vyhledávači sdělil, že se jedná o některé z malých písmen abecedy.

488120394
Zde jsem použil dvě výčtové skupiny znaků. Nejprve hledám znak J, nebo P, za kterým následuje libovolné množství znaků a až z a to vše uzavírá znak a. Tomuto výrazu tedy odpovídají třeba jména jako Jana, Jarmilka, Petra apod.

Složené závorky určí délku

Pokud se opět podíváte na regulární výraz telefonního čísla, už tedy můžete snadno rozluštit, že za znakem + následuje nějaká číslice z rozsahu 0-9. Nicméně hned za hranatými jsou jakési složené závorky \+[0-9]{3}. Pomocí nich mohu přesně určit počet opakování. Vzoru [0-9]{3} tedy odpovídá jakékoliv celé trojciferné číslo. Může to být 000, 125, 489 nebo třeba 999. V našem případě se ale jedná o mezinárodní předvolbu +420 a další varianty.

520753625 
Hledám text, který začíná jedničkou, za kterou jsou tři nuly

Znakové třídy

Za složenými závorkami se v regulárním výrazu telefonního čísla nachází znak \s a otazník: \+[0-9]{3}\s?. Znak \s je dalším speciálním zástupcem, takzvanou znakovou třídou, která představuje mezeru a jiný prázdný znak. Hned za ním je otazníku, který už znáte, znamená totiž žádné, nebo právě jedno opakování. Jednoduše řečeno, za číslem předvolby může být nejvýše jedna (nebo žádná) mezera.

Po mezeře konečně následuje devět číslic telefonního čísla: \+[0-9]{3}\s?[0-9]{9}. A to je celé, vytvořili jsme jednoduchý vzor pro telefonní číslo. Samozřejmě má své mouchy, mohli bychom totiž pracovat i s možností, že budou lidé místo mezery používat třeba pomlčku a tu budou klást i do vlastního telefonního čísla, ale pro začátek to stačí.

584130199
Hotovo, jednoduchý regulární výraz pro nalezení telefonního čísla je hotový. Jak vidno, zdaleka neumí vše a potřeboval by ještě dopracovat.

Regulární výrazy nabízejí vedle zástupce pro prázdný znak \s mnoho dalších znakových tříd. Znak \w označuje písmeno, \d odpovídá číslici a \S je cokoliv jiného než prázdný znak. Výčet [\s\S] tedy vlastně odpovídá jakémukoliv možnému znaku. Tomu samému odpovídá i tečka.

116846769
Použití znakové třídy \d pro vyhledání čísel
823883651
Použití znaku .+ pro libovolný znak s opakováním. Všimněte si, že jsem u druhé tečky použil zpětné lomítko, aby na tento znak vyhledávač pohlížel opravdu pouze jako na klasickou tečku.

Skupiny

Důležitou součástí regulárních výrazů jsou také skupiny znaků ohraničené kulatými závorkami. Pokud tedy nebudeme hledat výskyt konkrétních znaků, ale třeba celých slov, můžeme je vložit do závorek a dále s nimi pracovat.

777850399
Práce se skupinou a znakem |, který znamená nebo. Hledám tedy výskyty výrazů Ha a ha.

Vzor (ha)+ tedy odpovídat textu, ve kterém se alespoň jednou opakuje výraz ha. Může to být haha, hahah, hah, ha a tak dále.

Kde používat?

Tou nejdůležitější otázkou je ale samozřejmě to, kde vlastně regulární výrazy použít v praxi. S regulárními výrazy si dnes rozumí většina programovacích jazyků včetně populárního Javascriptu, jejich znalost je tedy elementárním předpokladem každého kodéra, který je může použít s adekvátní funkcí a metodou daného programovacího jazyka, která buď podle regulárního výrazu hledá v textu, zaměňuje text za jiný, případně testuje, jestli text odpovídá regulárnímu výrazu. Této techniky se používá třeba u webových formulářů, kdy se pomocí regulárního výrazu testuje, jestli jste zadali e-mailovou adresu ve správném formátu.

Regulární výrazy ale samozřejmě může využít i běžný smrtelník, pro pokročilé vyhledávání je totiž používají mnohé textové editory a správci souborů. Regulární výrazy tedy můžete použít třeba v populárním Total Commanderu nebo třeba v textovém editoru PSPad.

884528374
Vyhledávání telefonních čísel v rozměrném textovém souboru s více než milionem řádků pomocí regulárních výrazů. Přesně to umí třeba PSPad.
849394619
Potřeboval jsem vyhledat všechny soubory ve složce, které začínaly slovem Jakub, následovalo libovolné množství libovolných znaků a vše uzavíral řetězec Windows.png. Z obrázku výše je patrné, jaké soubory Total Commander nalezl.

Jelikož se data stále častěji přesouvají na web, regulární výrazy můžete použít i pro hledání na internetových stránkách. Slouží k tomu nejrůznější webové doplňky – pro Chrome třeba Regex Search.

Diskuze (34) Další článek: Amazon bude mít do konce roku ve skladech 10 000 robotů

Témata článku: , , , , , , , , , , , , , , , , , , , , , , ,