BLOG

Přečtěte si poslední novinky ze světa datových technologií a BI.
Nezapomeňte se přihlásit k jejich odběru na e-mail.

REGEX – úvod do světa regulárního výrazu

regex

RegEx (z anglického Regular Expression) je zkratka, již lze do češtiny přeložit jako regulární výraz (rovněž známý jako REGEXP nebo RATIONAL EXPRESSION), který představuje proces, kde se text, jehož délka může být různá, porovnává s posloupností vybraných znaků (= vzor) a následně se vyhodnocuje shoda hledaného textu s tímto vzorem.

Zní Vám to povědomě? Možná Vás hned napadne funkce „Find“, kterou všichni dobře známe např. z MS Word. Ano, i ta je velmi podobná RegExu, kdy si vytvoříme svůj vlastní vzor (hledaný znak(y)) a aplikujeme jej na svůj dokument nebo místo, kde chceme vzorec najít. Princip je stejný, jen regulární výraz nic nezvýrazňuje, ale vrací text na výstupu.

JAK FUNGUJE VYHLEDÁVÁNÍ

Vyhledávání je založeno na znacích, nikoliv na celých slovech nebo větách (které jsou sestaveny ze znaků do vzoru). V následujícím textu:

budeme hledat slovo „company“.  K vyhledávání lze přistoupit dvojím způsobem – byznysovým a technickým.

Z pohledu byznysového je zřejmé, že naším cílem je najít ve větě slovo „company“ a každé slovo, které nehledáme, přeskočit. Takto by to fungovalo, pokud by byl RegEx založen na slovech, což ale není.  Z pohledu technického je hledání založeno na jednotlivých znacích, tedy hledáme znak „c“ následovaný znakem „o“, „m“, „p“, „a“, „n“, „y“, a takto RegEx skutečně funguje.

Výsledek bude v obou přístupech stejný.

RegEx funguje na těchto základech, ale zahrnuje celou řadu vlastností, které tuto základní logiku vyhledávání rozšiřují.

JAKÉ VÝSLEDKY UMÍ REGEX VRÁTIT?

RegEx rozšiřuje proces vyhledávání o vlastní funkce, takže se pojďme podívat na základní vylepšení. V předchozím odstavci bylo popsáno, jak najít výraz „company“ na základě posloupnosti znaků c-o-m-p-a-n-y. V RegExu lze ovšem upravit vyhledávání využitím speciálních znaků, tzv. „game changers“. Tyto funkce Vám umožní vytvořit vzor, který lze porovnat, aniž byste museli psát konkrétní text:

RegEx nejsou jen číslice, velká a malá písmena a další znaky, ale zahrnuje i jejich kombinace. Níže naleznete kombinaci a popis užitečných vzorových oblastí. 

CO JE VZOR

Vzor si můžeme představit jako šablonu písmen, číslic, symbolů a různých znaků, stejně jako ve funkci FIND, ale vzor je založen na specifické syntaxi, která mění princip párování. Zatímco ve funkci FIND napíšete, co hledáte, v regulárním výrazu můžete napsat, jaký má být tvar, délka textu, počet výskytů znaku, který chcete vrátit.

Rozdíl proti FIND je v tom, že nehledáte něco konkrétního, ale chcete vrátit určitý text na základě šablony. Máte například seznam telefonních čísel a chcete vrátit všechna v požadovaném formátu „+XXX-XXX XXX XXX“. Napíšete tedy vzor, který vrátí veškerý text, kde prvním znakem je symbol „+“, následují 3 číslice, pak je „pomlčka“ a pokračuje 9 číslic seskupenými po třech a oddělených mezerou „ “.

JAK ZAPSAT REGEX

Tato kapitola popisuje základní syntaxi vzorů. Každý znak ve vzoru může změnit výsledek. Je rozdíl, pokud místo [] nebo {} napíšete (), rozlišení probíhá také na úrovni velkých a malých písmen. Pro lepší pochopení níže uvádíme popis základních oblastí regulárního výrazu, kde je návrat regulárního výrazu žlutě zvýrazněn.

 

Skupiny (Groups)

Skupiny jsou sekvence symbolů v pořadí v závorkách „()“, znaky uvnitř jsou sloučeny pomocí operátoru AND (místo rozsahů, kde je použit operátor OR, viz níže).

Textový vstup:

Případ 1 – vyhledej konkrétní text

Vzor: (20)

Výsledek:

návratový text bude „2020“, protože hledáme znak „2“ následovaný „0“. Platí pouze pro rok 2020 („20“ bylo nalezeno dvakrát), pokud by v textu místo „2020“ bylo ”2021” pak návrat bude pouze ”20”, protože regulární výraz najde znak ”2”, což je v pořádku, a pak se zeptá, zda je další znak ”0”, pokud ne, pak neexistuje žádná shoda a není co vrátit.

Případ 2 – vyhledej text, který obsahuje

V regulárním výrazu je speciální znak tečka „.“, což znamená, že jej lze nahradit jiným znakem (písmeno, číslice, mezera, .atd.), takže bude vráceno pouze to, kde je „a“ a více znaků.

Zadání textu:

Vzor: (a.)

Výsledek:

Z výsledku je vidět, že poslední výskyt „a“ nebude vrácen, protože k němu chybí další znak (neodpovídá vzoru).

 

Rozsahy (Ranges)

Rozsahy definují množinu znaků oddělených výrazem OR nebo pomlčkou „-“, každý z nich bude porovnán. Tato množina se zapisuje do hranatých závorek [..]

Nabízí se několik variant, jak dosáhnout požadovaného výsledku:

Textový vstup:

Případ 3 – vyjmenujte znaky v hranatých závorkách

Vzor: [abcd1234: ]

Ve výše uvedeném příkladu byly návratové znaky „a“ nebo „b“ nebo „c“ nebo „d“ nebo „1“ nebo „2“ nebo „3“ nebo „4“ nebo „:“ nebo mezery, bez jakéhokoli požadavku na pořadí znaků (z důvodu chybějícího znaku „-“ se mezi znaky používá operand NEBO). Mějme na paměti, že regulární výraz rozlišuje velká a malá písmena, pokud chceme zahrnout i velká písmena, musí být uvedena také v hranatých závorkách.

Výsledek:

Případ 4 – nastavte rozsah znaků

Vzor: [a-d1-4: ]

Zde nepíšeme všechny požadované znaky, ale za použití pomlčky  „-“ vytvoříme rozsah (bez pomlčky se budou prvky oddělovat operátorem OR viz případ 3), a-d znamená, že chceme všechny znaky od „a“ až po „d“, protože čísla a velká písmena mají stejnou logiku, tj. [A-D] nebo [1-9], zároveň můžete zkombinovat s operandem OR „:“ a mezerami jako v „Případu 3“ a zahrnout „:“ a „ “ do výsledku.

Případ 5 – „Zakázané“ znaky (except characters)

Vzor: [^e-z^5-9^A-Z^0^)]

Klíčovým znakem je „^“, což znamená, že „kromě“ vyjmenovaných znaků (z případu 3) jej lze kombinovat s rozsahem (viz případ 4). Znak „^“ je třeba vložit před každý znak nebo rozsah, který by měl být přeskočen, např. ^e-z znamená přeskočit všechna písmena z rozsahu „e-z“, potom je ^5-9, a tedy přeskočit číslo od „5 do 9“, totéž platí pro přeskočení pro velká písmena “A-Z“, „“)“ a „0“.

 

Předdefinované skupiny znaků (Character classes)

Skupiny a rozsahy jsou užitečné, proto některé z nich dostávají „zkratky“, když chceme mít jasný a jednoduchý regulární výraz, viz seznam níže (tento seznam není kompletní, obsahuje pouze nejpoužívanější).

Tyto „zkratky“ nahrazují některé vzory jako např. „\w“ je zkratkou pro výraz „[a-zA-Z]“.

Případ 6

Textový vstup: 

Kotvy (Anchors)

Kotvy vrací první / poslední shodu pro každý řádek (více textu oddělených znakem nového řádku). Pro tento příklad máme následující text.

Vstupní text:

123

321

132

Případ 7 –  konec řetězce (textu, v němž se vyhledává)

Vzor: 3 $

Výsledek:

Vrátí se pouze odpovídající znak, který je na konci řádku, protože je ukotven „$“. Když smažeme symbol dolaru, vrátí se všechny „3“ ze všech řádků, kde se nachází.

Případ 8 –  začátek řetězce (textu, v němž se vyhledává)

Vzor: ^3

Výsledek:

Toto je stejný případ jako Případ 7, ale kotvu upevňujeme na začátek každého řádku. Pokud odstraníme „^“, výsledkem budou opět všechny řádky, kde se vyskytuje číslo 3. Možná se ptáte, proč se „^“ nyní chová jako kotva a ne jako výjimka, jako tomu bylo v Případu 3. Je to proto, že tento vzor neobsahuje kulaté ani hranaté závorky.

 

Kvantifikátory (Quantifiers)

Určuje, kolikrát musí být prohledána skupina, znak nebo rozsah v hledaném textu, aby byly nalezeny shody.

To lze snadno provést pomocí skupin, když zapíšeme „(abcabcabc)“, znamená to, že hledáme „abc“ zapsané v řádku 3krát, ale měli bychom se snažit o to, aby byl náš vzor dobře čitelný, proto můžeme pomocí symbolu napsat, kolikrát se má ve vzoru objevit „{}“ a číslo uvnitř, tj. „(abc){3}“ je ekvivalentní předchozímu případu.

Případ 9 –  fixní počet shod

Textový vstup:

Vzor: (20){2}

Výsledek:

V tomto příkladu hledáme znaky „20“, které jsou dvakrát za sebou. Pokud změníme počet výskytů na {3}, nebude nic nalezeno, ale pokud jej změníme na {1}, bude výsledek stejný jako u {2}, protože pomocí {1} říkáme, že hledáme znaky „20“ v nichž se objevuje jednou, ale další výskyt také projde touto podmínkou.

Číslo v {} je povinné pouze v případě, že chceme specifikovat přesný rozsah nebo počet výskytů, jinak můžeme pro některé akce použít i „zkratky“, v nichž nejsou potřeba symboly „{}“, viz seznam níže

Vstupní text (pro případ 10-14):

Případ 10 – nula nebo více shod (často se používá se znakem „.“, viz níže)

Případ 11 – jedna nebo více shod

Případ 12 –  minimální počet shod

Případ 13 – nula nebo jedna shoda

Případ 14 – rozsah shod (od minimálních do maximálních shod)

Metaznaky (Escape Characters)

Trochu jsme se tohoto tématu dotkli v kapitole „Předdefinované skupiny znaků “, možná jste se sami sebe zeptali, když jste viděli „\w“, jak pro něj vytvoříme regulární výraz, pokud se jedná o dva znaky, které jsou již blokovány pro akci „vrácení slova(s)“. Řešením je Escape znak, funguje stejně jako ve většině programovacích jazyků. Pokud jste o něm nikdy neslyšeli, pak je to zpětné lomítko „\“. Můžete si jej představit jako znak, který vyvolává alternativní interpretaci následujících znaků v posloupnosti znaků, takže když napíšeme „\\w“, znamená to, že hledáme „\w“, protože zkratka „vrácená slova“ je zakázána prvním zpětným lomítkem ve vzoru, jinými slovy první zpětné lomítko říká ignoruj to další (které je v řadě).

Případ 15

ale když napíšeme \\\w, pak nejprve zpětné lomítko zakáže „zkratky“, ale regulární výraz pokračuje, bude hledat a výsledek bude stejný, viz další příklad

Případ 16

Případ 17

 

SOUHRN

V tomto článku Vám chceme poskytnout základní informace o regulárním výrazu a jeho fungování a ukázat několik příkladů základních vzorů. Možnosti RegExu jsou téměř neomezené, vše je založeno na Vašich potřebách a schopnosti kombinovat vzory dohromady. Ne vždy je to snadné, a proto doporučujeme použít online validátory regulárních výrazů pro kontrolu vašeho vzoru, např. zde https://regex101.com/.

Autor článku: Petr Holík, BI Consultant, Billigence

Čtěte také

KATEGORIE

VYHLEDAT NA BLOGU

KATEGORIE

Nejnovější přípěvky

ODBĚR PŘÍSPĚVKŮ NA E-MAIL

Přihlaste se k odběru blogových příspěvků na váš e-mail a získejte tak přístup k aktuálním informacím ze světa dat a BI.

SLEDUJTE NÁS
NA SÍTÍCH