[日記的なもの/フリーソフト/2006]

強力なのも困りもの / 2006-03-29 (水)

正規表現による検索結果もハイライトするって言う実装について。
現時点で、BM法を用いた普通の検索を行うと、検索結果が色分けに反映されるにも関わらず、
正規表現で検索をした場合は、検索結果を色分けしないという仕様だ。
いろいろ(実はたくさん)理由はあるんだが、まず根本に立ち返って、
これってそもそも、TNotePadをソース公開しているせいで、
色分けなど内部動作に関わる部分をよそのコンポの改変で実装するという点が問題だった。
改変してない正規表現ライブラリを使うなら、そのライブラリのURLだけ書けばいい。
でも、上下方向の検索やらユニコード専用化など、いろいろやっちゃってると、
結局その改変したユニットも含めなきゃビルドできなくなるし、
含めちゃう場合はなんか、よくわからないライセンスを理解しなきゃいけなくなる。
ライセンス関連の話には出来るだけ関わりたくないからこそ、
本当は全部公開したい真魚のソースをエディタエンジン部分に限って公開している。
そういう事情を乗り越えてまで、誰も使わないかも知れない正規表現のためにわざわざ、
検索時の色分けを実装するのは面倒だなって思っていたわけ。

面倒ではあるけども、当然にやらなきゃいけない事でもあるわけで、
普通の検索で色分けされるのに、正規表現じゃ色分けされないって仕様で良いわけがない。
で、なんとか、公開するソース部分は正規表現に依存せず、
それ以外の部分でやらせるような仕様で実装は試しにやってみた。
ところが、この正規表現が強力すぎて逆に問題を起こすことになる。

よそ様の普通のエディタでは、バッファを改行ごとに区切って扱うのが一般的だ。
よって、改行があればその時点で正規表現による検索は分断されてしまうことになるため、
内部でいちいち行を連結してから検索しなきゃいけなくなったりする。
しかしこの連結が動作速度に影響を与えるため、なるべく最小限の連結にとどめるか、
あるいは、改行をまたぐ検索をまるっきりあきらめるか、どっちかになっているはずだ。
萌ディタみたいに、自前で正規表現を実装し、改行を無制限にまたげるものは少ない。
そもそもこの、改行ごとにバッファを切り分けるっていうのは、
そうしないとたった1文字の変更がバッファ全体への変更につながり、
巨大なテキストでは動作速度が低下してしまうということで、あえてやっている常套手段なのだが、
真魚の場合、巨大なテキストほど編集よりも検索のスピードが重要になると、
最初から信じて疑わなかったので、あえてこの常套手段は避けている。
よって、バッファを分断してない真魚では、正規表現でいくらでも改行をまたぐことが出来る。

さて、正規表現で何行もマッチするような検索をした場合にどうなるかというと、
改行をまたげないエディタでは、検索も色分けも改行のところでストップする。
でも、改行をまたげる真魚では、どこかでストップさせてやらないとどこまでも進む。
以前書いたような、(.|¥n)+を検索ダイアログに入れられてしまったら、
1文字描画するたびにその文字からテキスト終端までマッチを起こすのと一緒であり、
よほど性能のよいPCで動作させてもほとんど反応しなくなってしまうだろう。
よって、真魚の場合はよそのエディタとは逆に、行単位で検索をやめさせる仕掛けを足す必要がある。
検索結果のハイライトは行をまたがない仕様に、あえてするしかない。
もちろん、これは付け焼き刃な対策でしかなく、
バックトラックがやたら発生するような検索をされれば、それだけで固まってしまうだろう。
いったんおかしな正規表現を入れてしまったら、検索ハイライトを解除するのも困難になり、
強制終了するしかないっていう最悪の状態にもなりうるのだ。

①「正規表現ではハイライトしない」か、
②「正規表現ではハイライトしない」というオプションをつけるか、
③たとえ固まるほど遅くなろうが、なんとしてもハイライトするか、

真魚だから、②にするくらいなら最初から①にする。①よりは③がやや好ましい。
なぜなら、正規表現をコッソリと実装した真魚で、堂々と正規表現を使うような人なら、
その結果で動作が鈍っているのだと言うこともわかってくれるに違いないからだ。
「正規表現」とも書いてないオプションを素人が使い、しかもバックトラック多発の表現書かないって。

つーことで実装完了。

正規表現辞典 (Desktop reference)
正規表現辞典 (Desktop reference)
佐藤 竜一



2009/01/09 (金) 更新 ©2005-2009 汁么ゴ魚 by Wantech
Powered by rNote 0.9.7.5