Regularni vyrazy
Tomáš Vondra
vondra na tesmail.cz
Pátek Říjen 11 18:36:53 MEST 2002
PS> On Fri, Oct 11, 2002 at 05:17:59PM +0200, Tomáš Vondra wrote:
>> Mam cislo, o kterem vim ze obsahuje krome cislic jeste znaky
>> "tecka" a "carka", oddelujici tisice resp. desetinnou cast, tj.
>> napriklad
>>
>> 12.033.223,33456
>>
>> ale predem nevim, kolik casti oddelenych teckou tam bude. Pokud to
>> cislo chci normalizovat, potrebuji ty tecky dostat pryc. Kdyz vim
>> ze tam ty casti budou dve, delam to takhle:
>>
>> $cislo =~ s/([1-9][0-9][0-9])\.([0-9][0-9][0-9]),([0-9])*/$1,$2/;
>>
>> Aktualne to mam reseno tak, ze mam napsano nekolik pravidel, ktera
>> mi vyhledavaji retezce se dvema, tremi, ctyrmi,... castmi, ale
>> chtel bych aby to umelo pracovat s predem neznamym poctem casti.
>> Jak na to?
PS> Ja asi nechapu, co to znamena normalizovat? A co ma delat to nahrazeni? To u
PS> z cisla 133.223,33456 udela 133,223, to je cilem?
No, asi jsem se nevzjadril uplne jasne, a v tom vyrazu je preklep.
Spravne tam ma byt
$cislo =~ s/([1-9][0-9][0-9])\.([0-9][0-9][0-9]),([0-9])*/$1$2,$3/;
PS> Nejedna se snad nakonec o $cislo =~ s/\.//g ?
Ne, to se nejedna. Cely problem ktery resim je nasledujici: mam text,
ve kterem mam najit cisla a prevest je do jakehosi "normalizovaneho
tvaru", tj. pouze cislice a pripadne desetinna carka (ci tecka, dle
vyberu). Priklad: 12.223,3349 -> 12223,3349
Ja cisla ve tvaru 14.000.444 obecne umim najit, a to napriklad pomoci
regularniho vyrazu
[0-9]([0-9])?(\.([0-9][0-9][0-9]))*(,[0-9]+)*
ktery by mi mel najit cisla vyse uvedeneho tvaru s nepovinnou
desetinnou casti. (Ten vyraz nepokryva cele spektrum tech cisel, ale
to je v tuto chvili nepodstatne).
Pritom ale ta cast (\.([0-9][0-9][0-9])) se tam muze opakovat
nekolikrat (a predem nevim kolikrat), ale ja pritom potrebuji to cislo
nahradit normalizovanym tvarem, tj. neco jako
$cislo = 12.223,3349;
$cislo =~ s/([1-9][0-9][0-9])\.([0-9][0-9][0-9]),([0-9])*/$1,$2/;
# ted $cislo = 12223,3349
Jenomze tohle funguje jenom pokud vim ze ty casti jsou dve. A me by
zajimalo, jestli lze nejak zapsat pomoci regularniho vyrazu.
Tahle otazka se samozrejme netyka vyhradne cisel, stejne tak bych se
mohl ptat na nahradu nejakych retezcu, o kterych predem nevim kolikrat
tam budou.
Tomas
Další informace o konferenci Perl