Nástroje pro regulární výrazy – Visual Regexp

17. října 2005

Tentokrát si vezmeme na paškál program, který má v jistém směru poněkud neběžné ovládání. Na druhou stranu však disponuje velmi elegantním zobrazováním shod se subvýrazy a potěší i začátečníky svou schopností interaktivně navrhovat regulární výrazy odpovídající vzorovému zadání.

Program Visual Regexp patří do stejné kategorie programů, jako minule představený The Regex Coach. Narozdíl od tohoto programu však zvládá jen operace Match a Replace (nikoli Split). Co se týče samotných operací, není ovládání zrovna nejšikovnější. Hlavní okno vždy obsahuje textové pole pro zadání regulárního výrazu a druhé pole sloužící jednak pro textový vstup, druhak i pro výstup (výsledek operace Match i Replace). To je velmi nešikovné, protože jakmile provedete operaci, ztratíte z programu text, který s regulárním výrazem porovnáváte.

Pokud pomocí programu teprve regulární výraz ladíte, můžete se k vstupního textu vrátit stiskem Ctrl+Z. Text můžete také uložit do souboru (File | Save sample...) a vkládat ho pomocí File | Load sample.... Pro zobrazení políčka pro vyplnění řetězce náhrady je třeba v menu Select mode vybrat Replace widget. Při používání zpětných referencí si musíme dávat pozor, zda zapisujeme referenci do samotného regulárního výrazu (ve tvaru \n, kde n je číslo subvýrazu) nebo do řetězce náhrady (pak musíme zapsat ve tvaru \\n, kde n je číslo subvýrazu – tedy použít zdvojeného zpětného lomítka).

Nahrazování

Podívejme se na malou ukázku použití programu při nahrazování. Často jsou URL s doménou začínající „www“ zapisována bez označení protokolu HTTP. Nechť jsou tedy všechny webové adresy, začínající řetězcem www., doplněny zleva ještě o označení protokolu http://. K nalezení odpovídající webové adresy můžeme použít regulární výraz www\.[a-z0-9-]{2,}\.[a-z]{2,4}(/\S*)?, který popisuje adresy, kde je doména třetího řadu „www“, doména druhého řadu má minimálně dva znaky a doména prvního řádu sestává z dvou až čtyř písmen. Za popisem domény následuje subvýraz (/\S*), který je celý nepovinný. Tento subvýraz se skládá z lomítka (/) za doménou a znakové třídy „nebílých“ znaků (\S), která je doplněna kvantifikátorem * (libovolný počet výskytů). Tento výraz je funkční, ale vcelku jednoduchý a tak propustí i některé nesmyslné adresy (například www.a-.cz), ale s tím se na tomto místě spokojíme. Jako náhradu pak stačí zapsat http://\\0 a máme vyhráno.

Visual Regexp - operace Replace
Visual Regexp – operace Replace

Zobrazování shod

Vlastnost, kterou mě program zaujal, je velmi přehledné vyznačování shod textu se subvýrazy regulárního výrazu. Jak je z obrázku vidět, text shody je barevně rozlišen podle shod s jednotlivými výrazy, přičemž barva odpovídá barvě příslušné části regulárního výrazu (a také barvě čísla na tlačítkách umístěných vedle tlačítka Match). Jednotlivá tlačítka s čísly můžeme použít pro zobrazení textu odpovídajícího pouze příslušnému subvýrazu. Červeně je označena ta část textu, která je součástí shody, ale není součástí shody s jakýmkoli subvýrazem. V části regulárního výrazu můžeme vidět světle žluté pozadí – to značí subvýrazy netvořící zpětné reference.

Visual Regexp - zobrazení shod
Visual Regexp – zobrazení shod

Textové shody mohou být zobrazeny dvojím způsobem – jako obyčejné zřetězení shod (Select mode | concat raw matches) nebo každá shoda na samostatném řádku (Select mode | insert new line between matches).

Program si v rámci jednoho spuštění pamatuje všechny použité regulární výrazy a umožní vám kdykoli se k nim vrátit (View | History of Regexp). Při práci se vám může hodit malá nápověda (spíše takový tahák) konstrukcí regulárních výrazů. Tuto nápovědu využijete asi i v případě, že si s regulárními výrazy docela rozumíte – některé konstrukce jsou poněkud netradiční (třeba \m, \M, \y, \Y).

Modifikátory

Ještě více než originální escape sekvence mě překvapily názvy modifikátorů. Přiznám se, že jsem se s tímto názvoslovím modifikátorů dříve nesetkal. Vzhledem k absenci nápovědy jsem kontaktoval autora programu, který mě odkázal na dokumentaci Tcl, který Visual Regexp používá.

Dovolím si na tomto místě suplovat chybějící nápovědu programu a popsat zde používané modifikátory (chcete-li příznaky, přepínače). V případech, kde to je možné, uvádím i odpovídající modifikátor používaný v Perl-compatible regulárních výrazech.

nocase Zajistí nerozlišování malých a velkých písmen v textu. Obvykle se nazývá „ignore case“ se zkratkou „i“.
all Zajistí globální vyhledávání, tedy v tetxu budou nalezeny všechny řetězce odpovídající regulárnímu výrazu. Obvykle se nazývá „global“ se zkratkou „g“.
line Tento modifikátor je kombinací (sloučením funkčností) modifikátoru lineanchor a linestop.
lineanchor Mění chování metaznaků „^“ a „$“ tak, že označují nejen začátek a konec řetězce, ale také začátek a konec řádku. Metaznak „^“ tak vytváří shodu nulové délky za každým znakem nového řádku (new line) a metaznak „$“ vytváří shodu nulové délky před každým znakem nového řádku (new line). Obvykle se tento modifikátor nazývá „multiline“ se zkratkou „m“.
linestop Ve Visual Regexpu standardně metaznaku tečka vyhovuje i znak nového řádku (new line). S tímto modifikátorem metaznaku tečka znak nového řádku nevyhoví. V Perl-compatible regulárních výrazech je chování metaznaku tečka opačné, tedy standardně mu znak nového řádku nevyhoví (a s perlovským modifikátorem „s“ vyhoví).
inline V grafickém rozhraní nemá žádný efekt. (Měl by, dle autora programu, mít efekt při použití funkce Edit | Copy regexp to clipbord, která mi bohužel při testování nefungovala vůbec.)

Visual Regexp - Make regexp
Visual Regexp – Make regexp

Závěrem by bylo škoda nezmínit se o nevídané a zvláště pro začátečníky vcelku šikovné funkci, kterou je „tvořič“ regulárního výrazu (Insert regexp | Make regexp...) na základě seznamu slov, které mají regulárnímu výrazu odpovídat. Myslím, že obrázek je dostatečně ilustrativní.

Předchozí článek marketix
Další článek ibundesliga.cz
Š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 *