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