強力な正規表現#6

最初は、ヘルプに遅いと書いてあるから速くできるんじゃないかとか、
まだ対応してない物を自前で対応できないかとか、
そういうつもりで正規表現ライブラリの中身を検証していたはずだったが、
途中からはアプリが落ちるか落ちないかの話題に変ってしまったな。



で、一応解決したよ。現在は、8000どころか80000文字でも落ちないようになった。
もちろん、32bitを超える数字のケアはしてないので、そこであふれるだろうが。
32bit以上のケアしないことがもちろんかどうかは知らないが、
どうせそれ以上のファイルを扱おうとしても激遅で使い物にならないから別にいい。
正規表現だって、そんな数千文字にヒットさせなきゃ落ちないわけで、
今回行った対応が必要かどうかは疑問が大いにある。
真魚はコッソリと、使い方すら書かずに正規表現を実装しているわけだが、
ものによっては正規表現でいろんな事が出来ることがウリになってるものだってあり、
そういったエディタでも落ちるライブラリを使い続けているということは、
こんな正規表現の使い方をする人はいないから対応しなくていいって事じゃないかと。
そんな言い訳を考える前に夜更かしして修正できたが。

今回やったのは、TRegExprのMatchPrimメソッドが再帰で処理をしている場所で、
メソッド内で使う変数を全て自前のスタックに入れてgotoで先頭に行かせるというもの。
gotoを使うことに抵抗はないので、ここはこれで大丈夫だが、
ちょっと問題あるかも知れないのが、用意したスタックを復帰する部分。
スタックから取り出したブツには、どこからgotoしたかの情報も入っていて、
whileやcaseが深く入り組んだ中にgotoで戻る。
ちょっと古いバージョンのDelphiについてきた言語ガイドにも、
gotoは脱出用であり、ループの中に入るために使うとヤバい可能性があると書いてある。
でもこれ以外やり方が思い浮かばないし、実際に80000文字大丈夫になったし。
本当は再帰より効率的なやり方でまるっきり変更すべきなんだろうけど、
再帰と全く同じ事をあふれにくいスタックでやらせただけにしてしまった。
Delphiのコード自体は読めるが、正規表現の仕組みがわからないんだから、
解決法もこれしかないじゃんって感じ。

ところで、AlphaのXXXX(読めません)な日記からリファラがたくさんついている。
k2topよりさらに多くの人が来てて、ログがどんどん流れちゃっている。
名前は知ってるがダウンロードしたこともないエディタで、マイナーだと思ってたが、
リファラの数だけみるとk2以上のユーザーがいるのかも知れない。
煮るなり焼くなり好きにしてみるか。

B000ARCKN8
B000ARCKN8

たぶん関連のある記事:

コメントは終了しています。