2010-10-22 (金)
*PHPのpreg_*系の正規表現
以下のコードをPHPで実行するととても時間がかかります.さらに,str_repeatの数を2000くらいにすると,PREG_RECURSION_LIMIT_ERRORになりnullが返ってきてしまいます(この時は一瞬).(PHP5.2.13と5.2.9で確認)
$str = str_repeat('abcdefghijklmnopqrstuvwxy',1000); print strlen($str); $str = preg_replace('/[a-y]+(z+)/','', $str); print "preg_end\n"; print $str;
PHPのバグなのか,PCREの仕様なのか….もしかして,PCREってあんまり賢くないのかなぁ.よっぽど愚直な実装でない限り,この正規表現は線形時間で済むはずだけど….
ちなみに,Perlで同様のことをしても一瞬で正しい結果が得られます(あたりまえですが).