峯島雄治のDelphi

ボーランド社が販売しているコンピュータプログラムのビジュアル開発ツールDelphiとC++Builderについてのページ


更新情報

2006/09/16
配布ファイルの名前を小文字にした(REXP017.LZHをrexp017.lzh, AWKF031.LZHをawkf031.lzh)
2004/01/24
TAWKStr.Subメソッドのバグを直したコンポーネント(Kondoさん作)の紹介。
2004/01/17
TAWKStr.Subメソッドのバグの追加情報を公開。
2003/12/18
TAWKStr.Subメソッドのバグ情報を公開。
2001/09/15
正規表現を使った文字列探索/操作コンポーネント集 バージョン 0.17 を公開
(仮)AWK言語 正規表現関数群 バージョン 0.31alpha を公開

コンポーネント

正規表現を使った文字列探索/操作コンポーネント集

バージョン
0.17
配布ファイル
rexp017.lzh (69,462 bytes)
動作確認環境
Windows 98 + Borland Delphi6 Japanese Personal edition。
1つ前のバージョン 0.16は Delphi2.0J と Delphi3.01J、C++Builder1J でも動いていました。今回の変更はバグの修正だけなので、確認はしていませんが、本バージョンもこれらの環境で引続き動作すると思います。
ライセンス
パブリックドメイン
概要

正規表現を使った文字列検索・操作をするためのコンポーネント2種類です。

TGrepコンポーネント

指定された正規表現にマッチするテキストファイル中の行を見つけ、 指定されたイベントハンドラを呼び出します。

TAWKStrコンポーネント

プログラミング言語AWKに実装されている文字列操作関数の中で、 正規表現を使うものをメソッドとして提供します。

  • TAWKStr.Match 文字列のパターンマッチ,
  • TAWKStr.Sub 文字列の置換 (Substitude)
  • TAWKStr.GSub 文字列の置換 (Global Substitute)
  • TAWKStr.Split 文字列の分割
正規表現

UNIXオペレーティングシステムの egrep や nawk コマンドで使われている正規表現が使えます。

日本語(Shift JIS)に対応しており、2バイト文字を1文字として認識し、 正規表現の中でも使う事が出来ます。

既知のバグ
Subメソッドのバグ
2003/11/19

ミ,,゚Д゚彡フサギコのフサフサDelphi談話室その11
106 :デフォルトの名無しさん :03/11/19 13:31
>>105 たとえば、
 Text:='banana';
 AWKStr1.RegExp:='(an)+';
 AWKStr1.Sub('X',Text);
のコードの場合、ドキュメントでは変数Textに「bXa」が返ってくることに なってるが、実際には「Xba」になって返ってくる。 つまり、変数Textの置換される文字列だけがゴッソリ消え、 置換する文字列がたんに先頭に連結されるだけになってしまう。 D6Personalにて検証済み。

2004/01/17

KondoさんからSubメソッドが正常に動いているという情報を いただいたので報告します。
Takefumi_Kondo 2004/01/17 09:48
題名:TAWKStr.Subメソッドのバグ情報 ですが
〜省略〜 ぼくは正常に動作しています。
D6Professionalです。もちろんD5Professionalでも正常です。

2004/01/17

作者がDelphi6 personal editionで確認したところ、
 Text:='banana';
 AWKStr1.RegExp:='(an)+';
 AWKStr1.Sub('X',Text);
では結果が誤った'Xba'になることを確認しました。
また、次のように'banana'をあらかじめCopyしておくと正しい結果'bXa'が得られました。
 Text:= Copy('banana', 1, 6);
 AWKStr1.RegExp:='(an)+';
 AWKStr1.Sub('X',Text);
この結果を再現させるテストプロジェクト を置いておきます。
作者はDelphi(Object Pascal)から離れて久しいので、 この原因を解明することができません。 昔は Text:='banana'として文字列定数を代入した文字列型の変数を変更してはいけなかったような気がするのですが、確かな事は忘れました。:-)
どなたか情報がありましたらお願い致します。

2004/01/24

2004/1/24 Kondoさんがこの バグが発現しないように直したコンポーネントを公開してくださいましたので紹介します。 Kondoさんのコンポーネントを利用するには依然として拙作rexp017.lzh (69,462 bytes)が必要となります。

変更履歴 (詳細)
0.17 バグ修正 2001/09/15
MP3の魔術師さんに教えて頂いたメモリリークの修正を適用。
おかぽんさんに教えて頂いたメモリリークの修正を適用。
0.16 第二次 一般公開 1998/03/07
TGrepで英大文字/小文字が正しく検索できなかったバグを修正。
漢字のキャラクタクラス指定([亜-熙]など)のバグを修正。
Delphi3, C++Builder1に対応
  • ユニットファイル名をRegExp.pasからbmRegExp.pasに変更
  • コンパイラの厳しくなった型チェックに対応
  • MBUtils.pasを使わないように変更。

ユニット

(仮)AWK言語 正規表現関数群

バージョン
0.31
配布ファイル
awkf031.lzh (110,591 bytes)
動作確認環境
Windows 98 + Borland Delphi6 Japanese Personal edition
1つ前のバージョン 0.30は Delphi2.0J と Delphi3.01J、C++Builder1J でも動いていました。今回の変更はバグの修正だけなので、確認はしていませんが、本バージョンもこれらの環境で動作すると思います。
ライセンス
パブリックドメイン
概要

プログラミング言語AWKが持つ正規表現を使う関数群のDelphi版です。

正規表現を使った文字列探索/操作コンポーネント集 に含まれるTAWKStrコンポーネントの機能をグローバル関数群として提供します。

変更履歴 (詳細)
0.31 バグ修正 2001/09/15
Delphi5で厳しくなった型チェックのためにIntegerとDWORDの使い分け。
bmUtils.pas の bmIsAsciiCntrl の(wch >= $00) は不要。
bmRegExp の UnitFinalize で theBmREAsciiIgnoreCaseDic.Free; が抜けているためメモリリークが起きる。

[Top page]

最終更新日2006/09/16
峯島雄治 bmonkey@nifty.com

yuji_minejima on Twitter