kde RE prestal matchovat
Pavel Smerk
xsmerk na informatics.muni.cz
Čtvrtek Červenec 24 16:53:42 MEST 2003
On Thu, Jul 24, 2003 at 11:47:24AM +0200, Honza Pazdziora wrote:
> On Thu, Jul 24, 2003 at 11:20:31AM +0200, Pavel Smerk wrote:
> > Aha, ja jsem se asi spatne vyjadril --- ja nedelam zadne /g, jen jsem si
> > rikal neco v tom smyslu, ze by se mohlo dat zjistit misto v retezci, kde
> > perl dosel k definitivnimu zaveru, ze retezec vzoru neodpovida. Ale jak ted
> > na to koukam, je to temer jiste nesmysl, takze nic. ;-)
>
> No, vzdycky muzes na konec toho regularniho vyrazu prilepit (.*)$ a
> pak se podivat, co na konci zbylo.
Tomu nerozumim. Mel jsem na mysli napr. "123456789" =~ /^1[23]*A?45[78]/,
kdy prvnim neodpovidajicim je 6, (.*)$ mi myslim nic nepomuze. Jde o
situaci, kdy pro nejakou mnozinu retezcu hledam spolecny vzor (rozumne
prisny, nikoli .* ;-) tak, ze si vypisuji zatim nepokryte retezce a upravuji
tvoreny vzor. Ale uz si myslim, ze to, co jsem chtel, je blbost. ;-)
> > (?: ), kdyz mam tech druhych fakt hodne. Ale to uz si asi moc vymejslim. ;-)
>
> Jo. :-)
>
> Mozna kdybys napsal, o co se vlastne snazis, tak bychom byli schopni
> zjistit, ze to je nejaka levarna a poradili bychom Ti, abys to nedelal
> nebo to udelal jinak.
Vyse popisovany vzor je plny (?:...)? casti, prijde mi zbytecne naplnovat $1
promenne, ale ani se mi nechce porad psat '?:'. Cili by se mi libilo, kdyby
slo nejak vypnout naplnovani $1 promennych, pripadne zmenit semantiku (?:
Jeste jsem narazil na nasledujici podivnost:
#!/usr/bin/perl -w
use strict;
warn unless "01111111111111110" =~ /^
((((((Y+A)+B)+C)+D)+E)+F)*
((((((Y+G)+H)+I)+J)+K)+L)*
((((((Y+M)+N)+O)+P)+Q)+R)*
0((1+)+)+
$/x;
Kdyz to pustim, trva to nekolik vterin, nez zjisti, ze retezec vzoru
neodpovida. To bych docela chapal, ((1+)+)+ je hloupy zpusob zapisu 1+ a
rozumel bych, ze nejaky ten backtracking muze v takovem pripade chvilku
trvat. Kdyz ale umazu nektery z prvnich tri radku reg. vyrazu, je to
vyhodnoceno okamzite (nikoli o tretinu rychleji nebo tak neco, kdyby se
nekomu zdal casovy rozdil maly, muze do retezce pridat jednicky, rozdil se
zvyrazni). Jak je to mozne?
S pozdravem P.
Další informace o konferenci Perl