★clipsed あとがき tomoreal/Makoto Tomo tomoreal@mc.neweb.ne.jp 注:新しいものが上の方にあります。 ※DosFilterの追加 DosFilterを付けました。xtrというテキスト整形ソフトを使 おうと、そのDLL版を手に四苦八苦しました。しかし、 どう もうまくいかずに、一旦、テキストボックスの中身をファイ ルに書き出して、それに対して標準入出力を使って対処する ことにしました。 ちなみに、こテキストの整形にもxtrを使っています。 これの副産物として、 大抵のdosコマンドが動くようになり ました。「sed/grepライク」がうたい文句でしたが、本物の sed/grepも動きます。複数行コマンドにも自動的に対応した 形となりました。 特に、windows2000ではDOS窓機能が大幅に強化されています。 cmd.exeの起動が速いので、Dosコマンドを実行しているのに、 あたかも内部コマンドのような感じを受けます。ただし、こ の機能を95/98で使うともたつく感じがすることでしょう。 いにしえの、dos資産が生かせる環境が出来たわけです。 こ のソフトがきっかけとなり、 スクリプト言語や入門編のc等 に挑戦しようと試みる方がひとりでも増えると望外の喜びで す。 (2002/01/10) ※grep機能の追加 grep機能を内蔵しました。反転(非マッチ)もできます。 反転の時に、xor演算子を使いました。1<-->0のトグルが 簡単に表現できるのでプログラムがシンプルになります。 (2001/09/09) ※変換補助機能のメニュー化 変換機能を一部、メニュー化しました。文字変換機能等は、正 規表現を使った置換というコンセプトからすると、どちらかと いうと付け足し部分です。こちらは、主にVBの関数を適用して いるにすぎませんし。「おきまりの表現」をメニュー化するの も、簡単です。メニューエディタで名称を付けたら、あとは数 行コードを追加するだけでいじるだけです。できれば、この部 分をテキストファイルにして、コンパイルせずともメニューか 出来るようになるといいですね。まぁ、見栄えは悪いですけど、 「おきまりの表現」がそうともいえるのかな?(2001/05/05) ※繰り返し文字を消す正規表現 acrobatで配られる文章も多くなりました。 これはきれいに印 刷されます。ところが、強調文字はどうも同じ文字を少しずつ ずらして重ねるという方法で実現しているようなのです。です ので、その部分をコピーしてテキストに張り付けると、同じ文 字が連なって出てきてしまいます。どうしたものかと悩みまし たが、これも正規表現を使えば単一化できることに気づきまし た。たったこれだけです。 s/(.)\1+/\1/gk いわれてみれば当たり前のようですけれど、\1を置換前文字列 の中でも使えるというのは、私にとっては新たな発見でした。 (2001/01/22) ※履歴のコメント機能について 履歴にコメントをつけてみたらうまく動きました。正規表現だ けだと時間が経つと忘れてしまうので、 メモをつけるために 「履歴ファイルをcsvにしないといけないなぁ……」 とおもっ ていました。試しに、メモを付けてみたらうまくいくではない ですか。恐らく、bregexp.dllで正規表現を解釈する際に、 頭 から切り出して行っているので末尾のごみは無視されるのでし ょ。とりあえず、うまくいっている間はこのままいきます。別 にプログラムをいじったわけでもありません。いままでは作者 も知らない「裏技」だったわけです。なお、履歴編集に関して は、ボタンにしていないので裏技っぽいですが、これはちゃん とコードを書いています。エディタを選べるようにするとめん どうなので、notepadに決め打ちですけど。 ちなみに私はメモ 帳トラッパで手に馴染んだエディタに変えています。 (2001/01/22) ※なぜ、VB5からVB6に変えたのですか? VB5のランタイムライブラリは、Windows98には標準で組み込まれていま す。しかし、VB6のランタイムライブラリは含まれていないので、 別に 配布する必要があります。これを避けるために、あえてVB5を1.2までは 使っていました。 しかし、Windows2000で試してみると「予期せぬエラ ー」が出て動きませんでした。あらためて、 Microsoftのホームページ をみてみると、Windows2000ではVB5は動作しないとのこと。(実際は、 動作はするのですが恐らく一部うまく機能しない部分があるため、動作 保証しないということでしょう。)ということで、VB6に変更しました。 VB6でコンパイルしたものは、 私の環境ではWindows95/98でも問題なく 動いています。環境によっては動かないことがあるかもしれません。特 にトリッキーな処理はしていないし、VB5と全く同じソースでVB6でコン パイルできたので、大丈夫だとは思います。もし、動かない際はご一報 下さい。(2000/10/04記す。) ※なぜ、VBを使うの?デルファイの方が速いというのに。 実は、最初に習ったプログラムはpascalです。構造化プログラム教育用 のコンパイラです。当時は、パソコン登場前夜だったので汎用機でこれ を習いました。デルファイも基本的にはpascalだと聞いています。です ので、デルファイを修得するのもやぶさかではありません。しかし、い ろいろと書物を読むと、 マイクロソフト・オフィスにはVBAがついてい るので、これと組み合わせて使うには、VBが便利だということでした。 これ以前はベーシックは全くさわったことはなく、かつ、オブジェクト 指向になれるのも結構とまどいがありました。 でも、VBAのコードをVB にそのまま持ってきても、確かに、たいていの場合動くので便利です。 ですので、いまはデルファイではなくVBを使っています。昔は、遅かっ たVBで作ったソフトの動作も、 CPUがスピードアップしてくれたおかげ で、そうストレスを感じないレベルになっています。ですので、当分は、 VBでコードを書くつもりです。 (2000/09/25記す。) ※半角カタカナの全角変換処理について カタカナの半角-->全角の処理は他に比べると遅いです。 いろいろとコ ードを工夫したのですが、現在のものがそれでも一番速い方法でした。 半角カナでは、濁音と撥音の表現方法が半角と全角とでは異なっている のが原因です。たとえば、ガとガ、パとパのように、半角では濁音、撥 音記号を別に付けるのに対して、全角ではセットになっています。この ため、特別の処理が必要になります。参考にした、古口正巳さんのオリ ジナルでは、これらを完全に特別視していたのですが、改良した私のバ ージョンでは、濁音、撥音記号は単独ではまずあらわれないだろうとい うことで、連続する半角文字列を一度バッファにためて、まとめて半角 -->全角変換するようにしました。 変換自体はVBの関数を使っているの ですが、この関数が遅いのです。恐らく、この関数の中で濁音、撥音の 処理をやっているからでしょう。半角だけということで、半角文字列が あらわれる回数だけ、繰り返しこの遅い関数を使っています。ですから、 半角カナが大量に含まれる文章では処理がどうしても遅くなってしまい ます。 (2000/09/24記す) ※特徴について 本ソフトの特徴は、比較的単純な置換に限ってですが、 Dosに降りなく てもperlのパワーが使えるということです。もちろん、他にも置換ソフ トは山のようにあります。このソフトの他のソフトに比べた特徴は、検 索文字列と置換文字列の組合わせの履歴がとれることです。置換コマン ドでは、検索文字列と置換文字列を別ウィンドウに入れさせます。分か ち書きすると取っつきやすいかもしれませんが、あとで再利用するとき には一苦労です。対で記録されていれば、同様の置換が簡単に出来ます。 特に正規表現のパターンの場合は、汎用性が高く、再利用できる機会も 多いです。(それにパターンを考えるのに多少なりとも時間がかかる)。 また、置換前と置換後を記憶しているので、置換パターンがどのように テキストに働いたのかを比較検討できます。そして、よりスマートな正 規表現パターンを作り上げることが出来ます。 正規表現が使えるソフトはありますが、後方参照出来るソフトはあまり おみかけしません。後方参照を使うと、ABC5000を5000ABCに置き換える ことも簡単にできます。 s/([A-Z]+)(\d+)/\2\1/gk Babaさんに感謝しなければなりません。 改行を含む全文字列を対象にできるので、複数行置換がパターンスペー スを使わなくても、比較的簡単にできることです。これも、メモリがふ んだんに使える今の時代ならではでしょう。 また、ヘルプを整備していて、 普通のsedのように行単位の置換の置換 がオプションのmをひとつ加えるだけで、 できるということを発見しま した。よく使用説明書は読むものです。 改行をCRとLFに分けて処理できるのも便利な機能です。 Dosのフィルタ を通すと、 Cでコードを書いてCRだけを取り去っても、擬似パイプを通 過した時点でちゃんと? CR+LFに戻ってました。それを避けるためには ファイルに直接書き込むしか有りませんでした。 しかし、 なぜか、 WindowsのクリップボードではちゃんとCr+Lfをわけて処理できます。エ クセルのセル内改行ではLFだけで改行していますので、比較的簡単にセ ル内改行文字列を作成することができるようになりました。 エクセルの他にマイクロソフトにはワードがあります。これは、残念な がら正規表現を使った検索置換はできません。正規表現もどきはありま すが、表現能力には格段の差があります。しかし、ワードも2000に なって、XMLで保存できるようになりました。XMLはテキストファイルで す。ということは、clipsedの出番です。ワードのXMLを理解するまでも なく、簡単な置換ぐらいだったらOKです。もちろん、試す場合には、幾 重にもバックアップをとってから実行しましょう。 (2000/09/14記す。9/15追記。) ※処理速度について 単純に正規表現エンジンやVBの関数を使っているコマンドは、満足なス ピードで動いています。しかし、半角カナの全角変換など、VBのループ を使って回しているところは対象文字列が長くなると極端に遅くなって、 一瞬ハングしたのではないかとも思えます。(まぁ、昔のVBはそうでし たし、 今のVBもそうです。 これでもずいぶんとマシになっているので す。) このプログラムは、文字列をちょっこと変換する時に使うことを想定し ています。しかし、 テキスト・コントロールの64Kの制限ではちょくち ょく壁あたってしまいますので、制限のないリッチエディット・コント ロールを使っています。なんと、対象文字列を格納する変数は、2G程 度まで大丈夫だということです。さすがにそこまでは試していません。 しかし、変換対象が大きくなればなるほど、処理速度も遅くなるものと 思います。(単純な置換は、Cで作ったDLLのパワーを使っているのでス ピードはそう落ちないかもしれません。) ですので、このプログラムで手に負えないものは、他のツールをお使い ください。Dosコンソール版の本家sedやgrepをペンティアムクラスの CPUで走らすと相当速いものと思われます。 (2000/09/14記す) 以上