Regularni vyrazy

Honza Pazdziora adelton na informatics.muni.cz
Pondělí Srpen 21 14:01:01 MEST 2000


On Mon, Aug 21, 2000 at 12:21:00PM +0200, Vladimír Fux wrote:
> 
> Chtel bych na jeden pruchod - tedy jednim prikazem
> nahradit ci spise pozmenit frazi podle prikladu:
> 
> V promenne $url mam "http://www.novak.cz/"
> V textu se mohou vyskytovat takoveto fraze:
> A)   "adresa=http://www.novak.cz/neco.html"
> B)   "adresa=neco.html"
> 
> Jak zajistit, aby v pripade B. to znamena,
> pokud za textem adresa nenasleduje obsah
> promenne $url se tam tento obsah doplnil,
> tedy aby doslo doslo k uprave textu na tvar
> "adresa=http://www.novak.cz/neco.html"
> resp. "adresa=".$url."neco.html"
> 
> Myslel jsem si, ze to pujde takto:
> ..
> $text=~s/(adresa=)(^[($url.*)])/\1$url\2/gi;

Problem je v tomto. [] je trida znaku. Tedy [http://www/] znamena jeden
znak z mnoziny hptw:/ a ne ten retezec http://www/.

Muze Vam pomoci tzv. lookahead, kterym jste schopen se zeptat, zda tam
je ci neni dany retezec:

	(?= .... )		pozitivni -- dany vyraz nasleduje
	(?! .... )		negativni -- dany vyraz nenasleduje

Vice viz. perldoc perlre (a je potreba rozumne novy Perl).

Cili muj prvni pokus by byl

	s/(adresa=)(?!\Q$url\E)/\1$url/gi;

Proc tam je to \Q a \E vysvetluje perldoc perlop -- prevdepodobne
nechcete, aby obsah $url byl chapan jako regularni vyraz, ale jako
podretezec.

Doufam, ze to pomuze.

-- 
------------------------------------------------------------------------
 Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
 .project: Perl, DBI, Oracle, MySQL, auth. WWW servers, MTB, Spain, ...
------------------------------------------------------------------------


Další informace o konferenci Perl