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.

Klepněte pro větší obrázek
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í.

Klepněte pro větší obrázek 
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.

Klepněte pro větší obrázek
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.

Klepněte pro větší obrázek 
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čí.

Klepněte pro větší obrázek
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.

Klepněte pro větší obrázek
Použití znakové třídy \d pro vyhledání čísel
Klepněte pro větší obrázek
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.

Klepněte pro větší obrázek
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.

Klepněte pro větší obrázek
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.
Klepněte pro větší obrázek
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.

Témata článku: Technologie, Programování, Odposlech, Haha, Mantra, UFO

32 komentářů

Nejnovější komentáře

  • Wu Thung 20. 9. 2014 22:22:46
    čížek má dobrý články, ale prostě nějak opomene zmínit rady, aby se rady...
  • Václav Novák 5. 6. 2014 11:34:50
    Docela se hodí mít po ruce tenhle tahák :-)...
  • SuPeS 5. 6. 2014 11:15:35
    Nedokázal by mi někdo prosím poradit. V PSpadu vyhledávám v textu...
Určitě si přečtěte

Operační systém běžným počítačům nedal Bill Gates, ale Gary Kildall

Operační systém běžným počítačům nedal Bill Gates, ale Gary Kildall

** Gary Kildall pochopil, že levné výpočetní čipy mohou posloužit jako univerzální počítače pro všechny ** Připravil pro ně proto první operační systém ** Později mu systém vyfoukl Microsoft a nazval ho MS DOS

23.  4.  2017 | Pavel Tronner | 56

Umělá inteligence je sice v plenkách, už teď ale přestáváme rozumět, jak vlastně funguje. To je problém

Umělá inteligence je sice v plenkách, už teď ale přestáváme rozumět, jak vlastně funguje. To je problém

** Už je to tady, lidé přestávají chápat počítače ** Systémy neuronových sítí začínají pracovat tak, že ani jejich tvůrci přesně neví, co se uvnitř děje ** Do budoucna to může být závažný problém

24.  4.  2017 | Jakub Čížek | 112

Před 35 lety měl premiéru legendární počítač ZX Spectrum. Připomeňte si „Gumáka“

Před 35 lety měl premiéru legendární počítač ZX Spectrum. Připomeňte si „Gumáka“

** Slavný osmibitový počítač Sinclair ZX Spectrum byl uveden právě před 35 lety ** Připomeňte si tento průkopnický počítač v tematických článcích ** Podívejte se, jak funguje dnes

23.  4.  2017 | Pavel Tronner | 13

Správný počítač má alespoň dva monitory. Anebo je to jinak?

Správný počítač má alespoň dva monitory. Anebo je to jinak?

** David si nedokáže představit práci bez dvou a více monitorů ** Kubovi naopak stačí jeden a ve více displejích se ztrácí ** Jaký přístup je lepší?

23.  4.  2017 | Jakub Čížek | 59

Brněnské soudy daly stop Uberu. Je to dobře, nebo krok zpět?

Brněnské soudy daly stop Uberu. Je to dobře, nebo krok zpět?

** Před několika měsíci začal Uber nabízet své služby i v Brně ** Nyní ale narazil, soudům se to totiž nelíbí ** Má sdílená ekonomika dostat zelenou?

22.  4.  2017 | Jakub Čížek | 28


Aktuální číslo časopisu Computer

První test AMD Ryzen

Velké testy: 22 powerbank a 8 bezdrátových setů

Radíme s koupí Wi-Fi routeru

Co dokáží inteligentní domy?