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