Použití regulárních výrazů se rozhodně neomezuje na jejich využití v různých programovacích jazycích. V systémech typu UNIX je použití regulárních výrazů na denním pořádku. I pro Windows však můžeme najít mnoho programů, které s regulárními výrazy určitým způsobem pracují.

Nedávno jste zde mohli zaregistrovat dvě série článků o regulárních výrazech (Perl-compatible regulární výrazy v PHP a Regulární výrazy a JavaScript). Použití regulárních výrazů se však rozhodně neomezuje na jejich využití v různých programovacích jazycích. V systémech typu UNIX je použití regulárních výrazů na denním pořádku (například v programu grep). I v prostředí Windows však můžeme najít mnoho programů, které s regulárními výrazy určitým způsobem pracují.

Regulární výrazy jsou například používány v pokročilejších textových a HTML editorech (například EditPad Pro či Homesite) při hledání a nahrazování řetězců, v některých souborových manažerech (například Total Commander) při hledání souborů nebo při nastavování filtrování došlých e-mailů ve webových rozhraních některých poštovních služeb. My si však na Intervalu postupně v několika článcích představíme programy, jejichž hlavním posláním je právě práce s regulárními výrazy. Jde v zásadě o dvě skupiny programů:

  • Programy, které slouží k vytváření, ladění a testování regulárních výrazů.
  • Programy, které slouží k porovnání shod (respektive vyhledávání odpovídajících řetězců) a hromadným záměnám řetězců.

Obě tyto skupiny se značně prolínají a tak většina programů částečně spadá svou funkčností do první i do druhé skupiny.

Ačkoli princip fungování regulárních výrazů, stejně jako nejběžnější možné operace s nimi (match = porovnání regulárního výrazu s řetězcem, replace = nahrazení části řetězce odpovídající regulárnímu výrazu jiným řetězcem, split = rozdělení řetězce na části, přičemž regulární výraz popisuje oddělovač) jsou v různých prostředích (například Perl, PHP, JavaScript, .NET) stejné, jisté nuance v pokročilejších možnostech práce s regulárními výrazy tu jsou.

Nejdříve si vezmeme na paškál několik programů, které pracují s .NET regulárními výrazy (samotné programy jsou .NETové aplikace a tak možnosti práce s regulárními výrazy v těchto aplikacích odpovídají možnostem .NET Framework regular expression enginu). Regulární výrazy v .NETu mají až na drobnosti (například trošku jiná syntaxe pojmenovaných subvýrazů) stejnou syntaxi a stejné chování jako Perl-compatible regulární výrazy v PHP.

The Regulator

Program The Regulator je jeden z nejznámějších programů pro tvorbu a testování regulárních výrazů (mimo jiné díky podpoře webu RegexLib.com). Zvládá všechny tři běžné operace (match, replace, split). Hlavní okno je rozděleno na tři části:

  • horní část – regulární výraz
  • levá dolní část – výsledek jednotlivých operací (záložky Matches, Replace output, Splits)
  • pravá dolní část – záložky Input (zpracovávaný řetězec), Replace with (řetězec náhrady při operaci Replace)

The Regulator - hlavní okno
The Regulator – hlavní okno

Protože tímto programem sérii našich recenzí začínáme, předvedeme si práci s programem tohoto typu na několika jednoduchých příkladech.

Příklad Match

Řekněme, že máme například mnohokrát přeposlaný e-mail a tělo e-mailu tak obsahuje mnoho e-mailových adres a my chceme všechny tyto adresy najít.

Pro popsání e-mailové adresy použijeme regulární výraz ([a-zA-Z0-9._-]+)@([a-zA-Z0-9._-]+)\.([a-zA-Z]{2,4}). Protože předmětem tohoto článku není tvorba regulárního výrazu popisujícího e-mailovou adresu, spokojíme se s tímto jednoduchým výrazem, kterému budou odpovídat všechny e-mailové adresy, které mají před zavináčem (stejně jako za zavináčem před doménou prvního řádu) alespoň jeden alfanumerický znak nebo znak tečka, podtržítko nebo pomlčka a za poslední tečkou v e-mailové adrese je doména prvního řádu (tvořená dvěma až čtyřmi písmeny). Regulární výraz je přitom ještě rozdělen kulatými závorkami na tři subvýrazy a tak operace Match zobrazí shody zvlášť pro jednotlivé subvýrazy.

Vhodný text pro vložení do pole Input jistě ve své e-mailové schránce najdete. Po stisknutí tlačítka Match v horní liště se vám v záložce Matches zobrazí strom shod s regulárním výrazem a jeho jednotlivými subvýrazy. Možná si teď říkáte, že je pěkné, že vidíte z e-mailu „vyzobané“ e-mailové adresy ve stromě shod, ale že byste je měli raději třeba jako seznam e-mailů (třeba každý e-mail na samostatném řádku). Jak se dočtete v první větě nápovědy, The Regulator je nástrojem pro testování regulárních výrazů, není tedy parsovacím či grep-like programem, takže je takový požadavek poněkud nadstandardní. Přesto lze daný problém v našem konkrétním případě vyřešit oklikou. Onou oklikou je použití operace Replace a mírná úprava regulárního výrazu.

Příklad Replace

Pusťme se tedy do řešení nastíněného problému. V poli Input necháme stejný text (nějakou e-mailovou zprávu obsahující e-mailové adresy ve svém těle). Jako regulární výraz použijeme (.*?)([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z]{2,4}). Když srovnáme tento výraz s výše uvedeným, zjistíme, že:

  • je regulární výraz popisující e-mail uzavřen do závorek (a tvoří tak druhý subvýraz)
  • z regulárního výrazu popisujícího e-mail byly odstraněny závorky tvořící subvýrazy
  • regulárnímu výrazu popisujícímu e-mail předchází výraz (.*?) (a tvoří tak první subvýraz)

Do záložky Replace with pak vyplníme $2 (respektive napíšeme $2 a stiskneme Enter!). Zápis $2 znamená zpětnou referenci na druhý subvýraz. První subvýraz zachytí veškerý text předcházející e-mailové adrese. Druhý subvýraz zachytí e-mailovou adresu. Protože se provádí globální vyhledávání a nahrazování (tedy nahrazení všech řetězců odpovídajících regulárnímu výrazu) a protože text následující za e-mailovou adresou je zároveň textem předcházející další e-mailové adrese (s výjimkou poslední), zachytí celý náš regulární výraz text těla e-mailu od začátku až do posledního znaku poslední e-mailové adresy.

Vraťme se ještě k prvnímu subvýrazu ((.*?)) – tečka zastupuje jakýkoli znak, líná hvězdička (tedy hvězdička následovaná otazníkem) znamená libovolný počet opakování (avšak preferován je nejmenší možný počet výskytů – to je ona „lenost“ kvantifikátoru). Tečka standardně zastupuje jakýkoli znak s výjimkou znaku konce řádku. Aby metaznak tečka pohltil i znak konce řádku, je třeba použít modifikátor (přepínač, příznak) Single line (zapíná se na hlavní liště – páté tlačítko zprava). Po stisknutí tlačítka Replace tak dostanete seznam e-mailových adres (každou na samostatném řádku), ovšem za poslední e-mailovou adresou bude bohužel následovat zbytek těla e-mailové zprávy.

The Regulator - Replace
The Regulator – Replace

Příklad Split

Třetí operací, kterou můžeme s programem The Regulator testovat, je Split, tedy rozdělení vstupního textu na části, přičemž řetězec, který se má použít jako oddělovač těchto částí, musí odpovídat zadanému regulárnímu výrazu.

V tomto případě si dovolím zcela primitivní modelový příklad. Řekněme, že máme seznam křestních jmen a ta jsou oddělena mezerou, čárkou, středníkem nebo nějakou kombinací těchto znaků. Do pole Input vyplníme třeba Karel Jarda, Pavel, Tomáš;Filip. Jako regulární výraz použijeme [,; ]+, tedy výraz, kterému odpovídá řetězec o minimální délce jeden znak složený výhradně ze zmíněných tří znaků (čárka, středník, mezera). Po stisknutí tlačítka Split se nám zobrazí v záložce Splits oněch nalezených pět jmen.

The Regulator - Split
The Regulator – Split

Další funkce a vlastnosti

V hlavním okně můžete mít otevřeno několik regulárních výrazů, respektive projektů (kompletní sada nastavení = regulární výraz, vstupní text a text náhrady). Tyto projekty můžete ukládat do souborů s příponou .express (strukturou se jedná o XML soubory). Při tvorbě výrazů vám může pomáhat Intellisense, což je funkce známá hlavně z programátorských vývojových prostředí, která vám na základě napsané části regulárního výrazu nabídne možné konstrukce.

The Regulator - Intellisense
The Regulator – Intellisense

Pokud s regulárními výrazy načínáte a nejste si jisti, co který znak či konstrukce ve výrazu znamenají, může vám přijít vhod také Regex Analyzer (v menu | View | Regex Analyzer |).

The Regulator - Regex Analyzer
The Regulator – Regex Analyzer

Často používané regulární výrazy či jejich části si také můžete uložit do Snippets (úryvky) – zvláštní paletky, kterou zobrazíte pomocí | View | Snippets |.

Pokud vytváříte aplikace ve VB.NET či C#, můžete si nechat na základě toho vygenerovat kód do vašeho programu (v menu | Tools | Generate code... |).

The Regulator - Generate Code
The Regulator – Generate Code

Díky spolupráci tvůrce programu s webem RegexLib.com můžete přímo z programu odeslat vámi vytvořený regulární výraz do databáze regulárních výrazů (v menu | Tools | Regexlib.com Submission Wizard... |) nebo vyhledávat regulární výrazy v této databázi (v menu | View | Web Search |). Součástí programu je nápověda popisující většinu funkcí. Program The Regulator 2.0.3 je freeware.

Poznámka: Záměrně jsem v tomto článku opomenul popis jednotlivých přepínačů (modifikátorů). Na přepínače se podíváme podrobněji příště, u programu, který obsahuje celou sadu přepínačů, kterou .NET prostředí nabízí. Popsány tak budou i všechny přepínače, které najdeme v programu The Regulator (a kde fungují zcela stejně).

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět