kde RE prestal matchovat
Honza Pazdziora
adelton na informatics.muni.cz
Pátek Červenec 25 10:47:22 MEST 2003
On Thu, Jul 24, 2003 at 04:55:04PM +0200, Pavel Smerk wrote:
>
> #!/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?
Doporucuji knihu Mastering Regular Expressions. Ten for je v tom, ze
takhle zapsany regularni vyraz s hvezdickami musi vlastne vyzkouset
vsechny kombinace nez zjisti, ze ani jedna z tech hvezdicek se mu
nepodari rozumne rozexpandovat. To co Ty vidis na prvni pohled on musi
postupne projit.
--
------------------------------------------------------------------------
Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
.project: Perl, mod_perl, DBI, Oracle, auth. WWW servers, XML/XSL, ...
Only self-confident people can be simple.
Další informace o konferenci Perl