Wuwejův zápisník

Regulární výraz pro nahrazení ampersandu entitou

25.05.2006 21:53, Wu | počítače | komentáře -

Potřeboval jsem v souboru se spoustou URL zajistit, aby obsahoval jenom entity "&", jinými slovy nahradit všechny výskyty ampersandu("&") entitou. Má to ovšem háček, pokud URL entitu už obsahuje, její "&" se nahrazovat nesmí - jinak vznikne "&". A to z funkční url udělá něco, co sice je pořád url, ale rozhodně není funkční.

Takže jak na to? Mohl jsem se sice smířit s dvojím nahrazením, nejdřív ze všech "&" udělat "&" a potom případné "&" nahradit za "&", ale proč bych to dělal tak jednoduše, když to jde složitě?

V prvním kroku si najdeme textový editor, který umí používat regulární výrazy při hledání a nahrazování (pokud nevíte, co regulární výrazy jsou, navštivte seriál na root.cz nebo stránky regularnivyrazy.info).

Zkusíme třeba PSPad. To je unikátní program, umí snad všechno, včetně regulárních výrazů. Bohužel bez vlastnosti "lookahead" neboli nahlížení vpřed, kterou jako na potvoru potřebujeme. Ale to se člověk dozví, až když to zkusí :). Další pokus bude JEdit a tady už se věc vydaří.

Otevřeme soubor s URL, vybereme menu "Search", položku "Find...", do prvního políčka pro vyhledávaný řetězec zadáme "&(?!amp;)", do druhého políčka pro nový text "&" a nezapomeneme zaškrtnout Settings-Regular expressions. Stiskneme tlačítko "Replace All" a je to.

Funguje to tak, že regulární výraz hledá text který začíná znakem "&" (to je to první "&"), pak se podívá dopředu a zkontroluje, že nenásleduje (operátor "?!") "amp;". Důležité je, že se tím neposouvá pozice zkoumaného znaku. Při standardním vyhodnocování bez lookaheadu bychom rozpoznali "&", pak postupně zkontrolovali, jestli další znak není "a", následující není "m", pak "p" a nakonec ";". No a kdyby to tak bylo a tedy bychom to původní "&" nahradit měli, máme smůlu, protože už jsme u čtvrtého znaku za "&".

Prosté, není-liž pravda?

Mimochodem nemůžu se zbavit podezření, že jedno vyhodnocení regulárního výrazu bude pomalejší než dvě primitivní nahrazení. Ale psát program, který to změří, se mi nechce...

12345
1148586780000

Informace

Google search

Kategorie

Sledujte také

Archiv

STRÁNKY ARCHIVOVÁNY NÁRODNÍ KNIHOVNOU ČR

CBDB.cz – Databáze knih a spisovatelů, knihy online