Nástroje pro regulární výrazy – The Regex Coach

5. října 2005

Tentokrát máme před sebou program, který kromě běžných operací umí předvést, jak funguje porovnání pomocí regulárních výrazů uvnitř. Pro ilustraci se podíváme i na dva příklady rozdílného řešení daného problému.

Program The Regex Coach je dalším zástupcem skupiny programů pro tvorbu, testování a ladění regulárních výrazů. Určen je především pro práci s Perl-compatible regulárními výrazy. Nepřekvapí, že okno programu sestává ze tří částí, a to panelu pro zapsání regulárního výrazu (pod nímž je sada zaškrtávacích tlačítek – checkboxů – pro jednotlivé modifikátory a zapnutí globálního nahrazování), panelu pro vložení textu a sady záložek pro „to ostatní“. Co je míněno „tím ostatním“ hned popíši.

Základní operace a modifikátory

Program zvládá všechny tři obvyklé operace (match, replace a split), ale dělá to poněkud jinak, než většina programů, které jsme si představili dříve. Především byste marně hledali nějaké tlačítko Match, Replace či Split. Veškeré operace se totiž provádění hned při každé změně regulárního výrazu (nebo textu či modifikátoru).

Shoda textu s regulárním výrazem (tedy operace Match) je realizována zvýrazněním odpovídajícího textu žlutým pozadím. Zvýrazněna je vždy pouze jedna shoda. Procházet textem a nechat si zvýraznit další shody je možné pomocí tlačítek v záložce Control. Zde můžete také nastavit pozici v textu od (a do) které se bude v textu vyhledávat, přičemž text, v němž se nevyhledává, se označí tmavě šedým pozadím.

A do třetice můžete v této záložce nastavit možnosti zvýraznění částí textu. Pokud označíte část regulárního výrazu (která je platným regulárním výrazem) a máte zvolenu možnost „selection“, část textu odpovídající označené části regulárního výrazu bude podbarvena oranžově. Na následujícím obrázku můžete vidět regulární výraz popisující české telefonní číslo v (mezi)národním tvaru.

The Regex Coach - zobrazení shody
The Regex Coach – zobrazení shody

Operace Replace funguje zcela standardním způsobem. V záložce Replace vyplníte Replacement string, tedy řetězec náhrady (který může obsahovat zpětnou referenci na subvýraz ve tvaru \1, \2, \3 a podobně) a ve spodní části záložky se ihned objeví text s provedenými změnami. Pravděpodobně budete chtít provést v textu nahrazení na všech místech, pak nesmíte zapomenout zaškrtnout checkbox „g“ (s popiskem v bublině Replace globally). Příklad na obrázku odstraní z českého telefonního čísla v mezinárodním tvaru předvolbu státu.

The Regex Coach - nahrazování řetězců
The Regex Coach – nahrazování řetězců

Operace Split, která je k dispozici ve stejnojmenné záložce, je zde řešena jednoduše a funkčně. Text, který bude rozdělen s pomocí regulárního výrazu, bude zpět to jednoho řetězce (textu) spojen pomocí jednoho z oddělovačů, který si vyberete. Počet částí, na které se původní text rozdělí, můžete omezit zadáním limitu.

Další funkce

Modifikátory ovlivňující regulární výraz je možno zvolit pomocí zaškrtávácích políček pod regulárním výrazem. K dispozici jsou modifikátory „i“ (ignore case – nerozlišuje malá a velká písmena), „m“ (multiple lines – metaznakům ^ a $ odpovídá i začátek a konec řádku), „s“ (single line – metaznaku . odpovídá i \n), „x“ (extended – ignorovány jsou „bílé“ znaky v regulárním výrazu) a „g“ (global – globální vyhledávání, ovlivňuje jen operaci Replace).

Podívejme se na další záložky. Jak praví dokumentace k programu, v záložce Info by mělo být jednoduchou angličtinou popsáno, co regulární výraz dělá. Faktem je, že toto tvrzení je značně nadnesené, protože například část výrazu .+ tento interpret popíše jako „the expression ‚.+'“, zatímco bych očekával spíše něco jako „any character one or more times“). V záložce Tree je regulární výraz rozebrán postupně na jednotlivé elementy a zobrazen jako strom.

Pro ladění výrazů využijete záložku Step – ta zobrazuje krok za krokem postup, kterým se regulární výraz porovnává s textem (z důvodu názornosti zde nejsou uplatňovány optimalizace, které vyloučí zcela zjevně výrazu neodpovídající text). Tato funkce nám umožní lépe pochopit, proč v konkrétním případě danému výrazu odpovídá právě určitý řetězec. Podívejme se na dva příklady.

Příklad první – alternace

Jistě víte, že metaznak | se používá k rozdělení regulárního výrazu na části a pokud porovnávaný řetězec odpovídá alespoň jedné této části, má se za to, že vyhověl celému regulárnímu výrazu. Nesmíme však zapomínat na to, že v určitých případech je výsledek porovnání regulárního výrazu s řetězcem závislý na pořadí, v němž uvedeme jednotlivé možnosti oddělené pomocí metaznaku |. Tato situace například nastane, pokud chceme hledat slova auto, automobil a automobilka v textu „Toto je automobilka.“ Člověk samozřejmě předpokládá, že bude jako shoda označen řetězec automobilka. Sami si můžete vyzkoušet, jak bude The Regex Coach za daných podmínek pracovat.

The Regex Coach - Step (příklad první – alternace)
The Regex Coach – Step (příklad první – alternace)

Jak vidíte, jako shoda byl označen (k naší nelibosti) pouze řetězec auto. Je to dáno tím, že jako shoda je označen vždy první vyhovující řetězec (i když by lidské oko našlo i řetězec „vhodnější“) a jednotlivé alternativy se testují v pořadí zleva doprava.

Řešení tohoto problému je snadné – vlastně jsou tu hned dvě řešení. První vás určitě napadlo, napsat alternativy v opačném pořadí, tedy vytvořit regulární výraz automobilka|automobil|auto. Druhé řešení (viz obrázek níže) je trošičku sofistikovanější a využívá toho, že slova se liší přidáváním znaků (přípon) zprava – všechna tři slova tedy začínají řetězcem auto a dvě slova začínají dokonce řetězcem automobil. Řešením je pak výraz auto(mobil(ka)?)?. Část auto je povinná, celá část (mobil(ka)?) je nepovinná, protože ji následuje ?. Stejně tak v tomto subvýrazu je nepovinná část (ka), protože ji následuje ?. Protože je ? nenasytný modifikátor, budou nepovinné části vždy součástí shody, bude-li to možné.

The Regex Coach - Step (příklad první – alternace, řešení druhé)
The Regex Coach – Step (příklad první – alternace, řešení druhé)

Na záložce Step nalezneme také zaškrtávací políčko (checkbox) Verbose (česky „upovídaný“). Není-li zaškrtnuté, některé kroky jsou vynechány (na výše uvedeném příkladu rozdíl jasně uvidíte).

Příklad druhý – XHTML tagy

Nalezení XHTML tagů (a následně jejich případná úprava či odstranění) je jedna z typických úloh, pro kterou můžeme použít regulární výrazy. Variant regulárních výrazů popisujících XHTML tagy je několik. My se podíváme na dva nejjednodušší regulární výrazy pro zachycení XHTML tagů (oba předpokládají validní kód). Jedna z variant ovšem pracuje efektivněji, což si opět můžete ověřit v záložce Step.

Regulární výraz, který začátečníka napadne jako první, je <.+>. Tento výraz příliš funkční není, protože + je nenasytné a tak zachytí všechny znaky mezi první otevírací závorkou < a poslední uzavírací závorkou > v daném textu (respektive na příslušném řádku; záleží na nastavení modifikátoru „s“).

Řešením je použít líný kvantifikátor +?. Nyní již .+? zachytí nejmenší možný počet znaků, za nimiž bezprostředně následuje uzavírací závorka >. Výraz <.+?> tedy bude funkční, ale neefektivní, protože najde otevírací závorku < a pak bude hledat shodu pro .+? – najde první znak XHTML tagu a následně se pokusí najít uzavírací závorku >. To se samozřejmě například u tagu <p class="anot"> (ještě dlouho) nepodaří. Vrátí se tedy zpět k výrazu .+? a zachytí pomocí něj první dva znaky XHTML tagu a opět se pokusí nalézt uzavírací závorku >… A tak dále, dokud .+? nezachytí tolik znaků, aby bezprostředně za nimi bylo možno najít >.

The Regex Coach - Step (příklad druhý – XHTML tagy)
The Regex Coach – Step (příklad druhý – XHTML tagy)

Protože XHTML tag mezi znaky < a > nesmí obsahovat znak >, můžeme metaznak „tečka“ nahradit negativní znakovou třídou, která povolí libovolný znak kromě > (tedy [^>]). Nyní již nepotřebujeme líný kvantifikátor +? (vyhoví nám naopak nenasytné +) a můžeme tak sestavit výraz <[^>]+>. Tento výraz najde otevírací závorku <, následně výrazu [^>]+ vyhoví co možná nejdelší řetězec složený z libovolných znaků kromě > a v platném XHTML dokumentu již nemůže následovat nic jiného než uzavírací znak >.

The Regex Coach - Step (příklad druhý – XHTML tagy, řešení druhé)
The Regex Coach – Step (příklad druhý – XHTML tagy, řešení druhé)

Souhrn

Klasické menu programu je velmi strohé a mnoho dalších funkcí zde neuvidíme. V menu Scroll můžeme nastavit posun v okně Target string (které bohužel v okně Target string v záložce Step začne fungovat, jen pokud se do tohoto okna nejdříve postavíte kurzorem). Pod File najdeme kromě obligátních položek navíc možnost uložit regulární výraz nebo text (podle toho kde se právě nachází kurzor) do obyčejného textového souboru. O něčem, jako je uložení kompletního nastavení (projektu) do jednoho souboru, si můžeme bohužel nechat jen zdát. Kromě toho mi při testování program systematicky padal, kdykoli když jsem chtěl uložit text, kterým byl XHTML kód.

Program je donation-ware a je pro soukromé použití zdarma.

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

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

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *