Regulární výrazy (1.) – úvod

Pokud trochu sledujete zdrojové kódy mých programů, jistě jste už zjistili, že v nich se železnou pravidelností používám regulární výrazy (regexpy – z „regular expression“). Proč to dělám? Protože regulární výrazy jsou nesmírně užitečným nástrojem pro zpracování textu, který se navíc dá v takřka stejné podobě použít všude možně – nemusíte být zrovna programátor, abyste ocenili sílu regexpů, protože je můžete i bez znalosti programování použít třeba v mnoha textových editorech. A protože mě známé české popisy podle mě vykazují řadu nedostatků, rozhodl jsem se napsat sérii článků uvádějících do úžasného, i když trochu mystického, světa regulárních výrazů. Ke čtení bych je doporučil zejména těm, kdo a) chtějí upravovat moje programy, nebo b) chtějí vytvářet e-booky podle mých návodů.

Co je to regulární výraz? Ve své nejobecnější podobě jde o termín teoretické informatiky, konkrétně té její části, která se zabývá jazyky a gramatikami (a konečnými automaty). Přesněji to nechci specifikovat, a to nejen proto, že byste mě mohli snadno nachytat na hruškách 😉 – ale hlavně jde o oblast, kterou už dost podrobně popsal někdo jiný a já nechci duplikovat jeho práci; pokud vás zajímají teoretické podrobnosti, poohlédněte se po nějaké učebnici teoretické informatiky.

Pro účely tohoto článku, a ostatně i pro běžné použití, si můžete regulární výrazy jako nějakou černou skříňku, které předhodíte regulární výraz a nějaký text, a na výstupu dostanete:

  • Informaci o tom, jestli text vyhovuje regulárnímu výrazu nebo mu nevyhovuje. Tento způsob použití se běžně používá pro ověřování uživatelských vstupů – pokud například chci od uživatele e-mailovou adresu, má smysl použít nějaký jednoduchý regexp na to, abych si ověřil, že zadaný text aspoň formálně vypadá jako regulární výraz (proč „jednoduchý“: protože kdybych chtěl mailovou adresu testovat skutečně komplexně, mohl bych taky dopadnout takhle: Mail::RFC822::Address).

  • Text rozebraný na ty komponenty, které mě zrovna zajímají. Dejme tomu, že píšu internetový prohlížeč. Uživatel mi řekne nějakou adresu, např. http://admin:heslo@www.pepak.net:80/download/youtube-downloader/#download. Já chci uživateli zobrazit obsah té stránky, a k tomu musím URL rozebrat na několik částí, se kterými se pracuje zcela odděleně: http na začátku mi říká, jaký protokol mám pro stáhnutí stránky použít. www.pepak.net je adresa serveru, kterou budu muset převést na IP adresu, abych se serverem mohl komunikovat. :80 říká, že se serverem mám komunikovat na portu 80 (na jedné adrese může existovat X nezávislých webserverů, každý posazený na jiném portu). admin:heslo udává přihlašovací údaje, které se u protokolu HTTP předávají jako součást hlaviček. /download/youtube-downloader/ je cesta, o kterou si webserveru na výše nalezené IP adrese a portu řeknu. No a nakonec #download mi říká, kam mám po vykreslení stránky nascrollovat, aby měl uživatel na očích přesně to, o co si řekl. Vhodný regulární výraz by mi právě tohle rozebrání dokázal zařídit. Sice asi ne tak efektivně, jako kdybych si na to napsal speciální prográmek, ale nepochybně by to pro mě, programátora, bylo mnohem jednodušší.

  • Text, ve kterém byly provedeny náhrady některých částí za jiné části. Dejme tomu, že bych chtěl cenzurovat vulgární výrazy; mohl bych napsat regulární výraz, který najde všechna nechtěná slova a nahradí je posloupností hvězdiček. Obdobně bych postupoval, kdybych chtěl vzít e-knihu v čistém textu a „zabalit“ ji do HTML kódu. Atd. – možností je nepřeberně.

Z teoretických základů nicméně vyplývá několik důsledků, o kterých je dobré přinejmenším vědět, pokud už se nechcete zabývat přímo tím, proč vyplývají:

  1. Existují texty, které se regulárním výrazem popsat nedají. Typickým příkladem jsou vnořené struktury. Když budu popisovat matematické výrazy, tak mi pro čísla, proměnné a čtyři základní operace klidně vystačí regulární výrazy, ale jakmile bych začal uvažovat o závorkách (nebo o prioritách operátorů), tak s regexpy okamžitě narazím. Ze stejného důvodu se regulární výrazy obecně nehodí pro rozebírání dokumentů v jazycích XML, HTML a obdobných, pro zpracování JSON datových struktur apod. (Nicméně, z toho, že přesto regexpy v YouTube Downloaderu masivně používám právě pro parsování HTML a JSON, je vidět, že za vhodných okolností to jde – jen si musím být vědom toho, že je velice snadné zkonstruovat okolnosti, které vhodné nebudou.)

  2. „Regulární výraz“ není konkrétní speciální zápis, ale obecný konstrukt s určitými vlastnostmi. V důsledku toho neexistuje jeden konkrétní „jazyk regulárních výrazů“, ale téměř doslova platí, že každý program má svoji vlastní variantu regexpů; všechny tyto varianty budou splňovat základní vlastnosti regexpů a možná budou sdílet i jejich zápis (nebo aspoň jeho část), ale budou se v nich vyskytovat rozdíly – přinejmenším v podporované množině funkcí, když už ne přímo v přiřazení významu jednotlivým symbolům. Z tohoto důvodu je nezbytné si vždy v dokumentaci vašeho nástroje ověřit, jaké konkrétní zápisy podporuje, a regulární výrazy tomu příslušně přiohnout. Neočekávejte, že když Microsoft Word, PSPad i SciTE (abych jmenoval jenom pár příkladů) všechny podporují regulární výrazy, budou to vzájemně kompatibilní regulární výrazy – nebudou.

Já budu v celé sérii článků používat tu variantu regulárních výrazů, kterou používá open-sourcová knihovna PCRE, která je asi nejblíže tomu, co bych označil za „de facto standard“. Nebo je aspoň zahrnuta v nástrojích, které mi vyhovují, a tudíž jí z důvodu vlastní lenosti preferuji. Další její výhodou je příznivá licence (Mozilla Public License) a dobrá dostupnost (v podobě Cčkových zdrojáků a/nebo DLL knihovny) a „široká“ podpora v různých aplikacích. Pokud preferujete jinou mutaci, budete si muset provést adaptaci na „svůj“ zápis sami.

Pozn.: Proč „široká“ v uvozovkách? Protože podporu resp. použití PCRE sice deklaruje obrovská spousta aplikací, ale co jsem zkoušel, když jsem hledal dobrý editor, většinou zůstává u té deklarace a „skutek utek“. Pokud je mi známo, z programů, které jsou zdarma, má její plnou podporu pouze plugin Regular Expression Search and Replace pro FAR Manager a skoro kompletní (chybějící pokročilé nahrazovací režimy) má textový editor Programmer’s Notepad. Ostatní programy se podpoře PCRE vzdalují spíš více než méně a platí totéž, co jsem napsal o odlišných mutacích PCRE – musíte si s tím poradit sami.

 

To by pro úvod stačilo a v příštím díle už se vrhneme přímo na regulární výrazy.

Podobné příspěvky:

One Response to “Regulární výrazy (1.) – úvod”

  1. avatar shrap napsal:

    Fajn clanek, tesim se na dalsi dily 😉

Leave a Reply

Themocracy iconWordPress Themes

css.php