BREGEXP DLL

2000.04.29 更新

BREGEXP DLLは、正規表現(Regular Expression)APIを提供します。 あなたのアプリケーションにPerl5の正規表現パワーが欲しい方是非どうぞ。 BASP21 DLLの正規表現メソッドは、このAPIを使っています。 テキスト文字だけでなくヌル文字をサポートしますのでバイナリもOK。 Visual Basicからも使えます。
2000/04/29 Update
Down Load!

Linux版ライブラリbregexpは こちら

ダウンロードファイル一覧


秀丸エディタ Version 3.01でBREGEXPの正規表現が使えます。 ArimacさんのBRegIfをインストールすればOK。
Arimacの部屋

Perlや正規表現については次のページが参考になります。
Perl初心者の部屋

BREGEXP.DLLが提供する関数一覧 (Visual C++)

BREGEXP.DLLが提供する関数一覧 (Visual Basic)

Visual Basic では、次の関数をサポートします。 使い方は、Visual Basic Tipsをどうぞ。
Private Declare Function Match Lib "bregexp" _
      (szRegstr As String, szTarget As String) As String

Private Declare Function MatchEx Lib "bregexp" _
      (szRegstr As String, szTarget As String, mode As Long) As Variant

Private Declare Function Replace Lib "bregexp" _
      (szRegstr As String, szTarget As String) As String

Private Declare Function Translate Lib "bregexp" _
      (szRegstr As String, szTarget As String, ret As String) As Long

Private Declare Function Split Lib "bregexp" _
      (szRegstr As String, szTarget As String, limit As Long) As Variant

パターンについて

正規表現は、文字列をパターンとして処理します。 パターンは、次のように"/"で囲んで指定します。
/パターン/修飾子
パターン文字に"/"を含む場合は、次のようにmを指定して別の文字を使うことができます。
m#パターン#修飾子
パターンの中にはメタ文字という特別の意味を持つ文字があります。 このメタ文字をマスターすると正規表現のパワーを実感できます。 BREGEXP.DLLで使えるメタ文字とその意味は、Perl5とほぼ同じです。従ってPerl5での 正規表現をそのままBREGEXP.DLLのパターンとして使えます。 次にBREGEXP.DLLで使えるメタ文字を示します。
         \     次のメタ文字をクォートする(取り消す)
         ^     行の最初にマッチする
         .     (改行以外の) すべての文字にマッチする
         $     行の終わりにマッチする
         |     選択
         ()    グループ化
         []    文字クラス

         \w   単語」の構成文字 (英数字と "_") にマッチ
         \W    単語の構成文字以外にマッチ
         \s    空白文字にマッチ
         \S    空白文字以外にマッチ
         \d    数字にマッチ
         \D    数字以外にマッチ
         \b    単語の境界にマッチ
         \B    単語の境界以外にマッチ
         \A    文字列の最初にのみマッチ
         \Z    文字列の最後にのみマッチ
         \t    タブ
         \n    改行
         \r    復帰
         \f    改ページ
         \a    アラーム (ベル)
         \e    エスケープ
         \033  8 進数で表した文字
         \x1b  16 進数で表した文字
         \c[   コントロール文字
直前の文字の数量子:
         *      0 回以上にマッチ
         +      1 回以上にマッチ
         ?      1 回または 0 回にマッチ
         {n}    ちょうど n 回にマッチ
         {n,}   n 回以上にマッチ
         {n,m}  n 回以上 m 回以下にマッチ


修飾子は、つぎのようなものです。
         k   文字を日本語(SJIS)として扱う(Perlにはこの修飾子はありません)
         m   文字列を複数行として扱う(メタ文字$の処理結果に影響を及ぼします)
         g   置換:グローバルな置換
         c   変換:SEARCHLIST を補集合にする
         d   変換:見つかったが置換されなかった文字を削除する
         s   変換:置換された文字が重なったときに圧縮する
         

非互換について

次の機能は、BREGEXP.DLLではサポートしていません。

●VBなどでパターンに変数名を書いても展開されません
●メタ文字
         \G    前回の m//g が終わったところにのみマッチ
●修飾子(パターンの右側につけるパラメータ)
         o     一度だけコンパイル
         x     拡張正規表現を使用する
         e     式の右側の評価を行なう

Visual C++での使い方

BREGEXP構造体について

BREGEXP.DLLでは、パラメータとしてBREGEXP構造体を使います。 BREGEXP構造体は、コンパイルブロックとも呼びます。 BREGEXP構造体は、Visual Basicからは使えません。
BREGEXP構造体は: などの機能を持ちます。 BREGEXP構造体をうまく使うと処理を高速化できます。 同じ正規表現を使う関数の呼出しには、同じコンパイルブロックを使えばいいのです。
次のBregPoolクラスは、BREGEXP構造体をプールして処理を高速化するサンプルです。
class BregPool
{
public:
	BregPool(int max){
		m_nmax = max;
		m_rxpool = new BREGEXP*[m_nmax]; 
		ZeroMemory(m_rxpool,sizeof(BREGEXP*)*m_nmax);
	};
	~BregPool() {
		Free();
	};
	void Free() {
		if (m_rxpool == 0)
			return;
		for (int i = 0;i < m_nmax;i++) {
			if (m_rxpool[i])
				BRegfree(m_rxpool[i]);
		}
		delete [] m_rxpool;
		m_rxpool = NULL;
	};
	BREGEXP* Get(char *regstr)
	{
		BREGEXP *r;
		for (int i = 0;i < m_nmax;i++) {
			r = m_rxpool[i];
			if (r == 0)
				break;
			if (r->parap == 0)
				break;
			// Check same Regular Expression
			if (memcmp(regstr,r->parap,(r->paraendp - r->parap) + 1) == 0)
				return r;		// we got !!!
		}
		if (i > m_nmax - 1)
			i = m_nmax - 1;
		if (m_rxpool[i])
			return m_rxpool[i];
		char msg[80];
		char p[] = " ";
		// Make Compile Block
		BMatch(regstr,p,p+1,&m_rxpool[i],msg);

		return m_rxpool[i];
	}
private:
	int m_nmax;
	BREGEXP **m_rxpool;
};

BregPoolクラスの使い方:
	static BregPool bpool(8);  // プール数を8
	char patern1[] = "tr/A-Z0-9/a-zx/g";
	BREGEXP *rxp = bpool.Get(patern1);
	int pos = 0;	// 検索ポジション
	while (BMatch(patern1,t1+pos,t1+lstrlen(t1),&rxp,msg)) {

	// BRegfree関数は、BregPoolクラスのデストラクタが
	// 呼出すので明示的に呼出す必要はない

BMatch関数のサンプル

	char msg[80];	// メッセージ領域
	BREGEXP *rxp = NULL;	// 必ずクリアしておくこと 
	// 検索文字サンプル
	char t1[] = " Yokohama 045-222-1111  Osaka 06-5555-6666  Tokyo 03-1111-9999 ";
	char patern1[] = "/(03|045)-(\\d{3,4})-(\\d{4})/";	// /(03|045)-(\d{3,4})-(\d{4})/
						// 03か045 の電話番号を検索
						// カッコ() は、それぞれの番号を記憶することを意味する
	int pos = 0;	// 検索ポジション
	while (BMatch(patern1,t1+pos,t1+lstrlen(t1),&rxp,msg)) {
		TRACE1("data=%s\n",t1+pos);		// 検索される文字
		TRACE1("found=%s\n",rxp->startp[0]);	// マッチ文字列
		TRACE1("length=%d\n",rxp->endp[0] - rxp->startp[0]);	// マッチ文字数
		for (int i = 1;i <= rxp->nparens;i++) {		// カッコ内のデータ 
			TRACE2("$%d = %s\n",i,rxp->startp[i]);
			TRACE2("$%d length = %d\n",i,rxp->endp[i]-rxp->startp[i]);
		}
		pos = rxp->endp[0] - t1;		// 次の文字の検索位置
	}

	pos = 0;
	char t2[] = " abcdabce abcdabcd abcdabcf abcgabcg ";
	char patern2[] = "/abc(.)abc\\1/";	// 検索中でのパターン記憶の例
	while(BMatch(patern2,t2+pos,t2+lstrlen(t2),&rxp,msg)) {
		TRACE1("data=%s\n",t2);			// 検索される文字
		TRACE1("found=%s\n",rxp->startp[0]);	// マッチ文字列
		TRACE1("length=%d\n",rxp->endp[0] - rxp->startp[0]);	// マッチ文字数
		for (int i = 1;i <= rxp->nparens;i++) {		// カッコ内のデータ 
			TRACE2("$%d = %s\n",i,rxp->startp[i]);
			TRACE2("$%d length = %d\n",i,rxp->endp[i]-rxp->startp[i]);
		}
		pos = rxp->endp[0] - t2;	// 次の文字の検索位置
	}

	if (rxp)			// コンパイルブロックの開放
		BRegfree(rxp);		// 忘れないように

TRACE結果:
data= Yokohama 045-222-1111  Osaka 06-5555-6666  Tokyo 03-1111-9999 
found=045-222-1111  Osaka 06-5555-6666  Tokyo 03-1111-9999 
length=12
$1 = 045-222-1111  Osaka 06-5555-6666  Tokyo 03-1111-9999 
$1 length = 3
$2 = 222-1111  Osaka 06-5555-6666  Tokyo 03-1111-9999 
$2 length = 3
$3 = 1111  Osaka 06-5555-6666  Tokyo 03-1111-9999 
$3 length = 4
data=  Osaka 06-5555-6666  Tokyo 03-1111-9999 
found=03-1111-9999 
length=12
$1 = 03-1111-9999 
$1 length = 2
$2 = 1111-9999 
$2 length = 4
$3 = 9999 
$3 length = 4
data= abcdabce abcdabcd abcdabcf abcgabcg 
found=abcdabcd abcdabcf abcgabcg 
length=8
$1 = dabcd abcdabcf abcgabcg 
$1 length = 1
data= abcdabce abcdabcd abcdabcf abcgabcg 
found=abcgabcg 
length=8
$1 = gabcg 
$1 length = 1



BSubst関数のサンプル

2桁の市外局番の市内番号をxxxxに変更します。
	char msg[80];	// メッセージ領域
	BREGEXP *rxp = NULL;	// 必ずクリアしておくこと 
	// 置換文字サンプル
	char t1[] = " Yokohama 045-222-1111  Osaka 06-5555-6666  Tokyo 03-1111-9999 ";
	char patern1[] = "s/(\\d\\d)-\\d{4}-\\d{4}/$1-xxxx-xxxx/g";
	int ctr;
	if (ctr = BSubst(patern1,t1,t1+lstrlen(t1),&rxp,msg)) {
		TRACE2("after(%d)=%s\n",ctr,rxp->outp);	// 置換したパターン数と文字列
		TRACE1("length=%d\n",rxp->outendp - rxp->outp);	// 置換後の文字数
	}

	if (rxp)			// コンパイルブロックの開放
		BRegfree(rxp);		// 忘れないように

TRACE結果:
after(2)= Yokohama 045-222-1111  Osaka 06-xxxx-xxxx  Tokyo 03-xxxx-xxxx 
length=63



BTrans関数のサンプル

大文字を小文字に、数字をxに変換します。

	char msg[80];	// メッセージ領域
	BREGEXP *rxp = NULL;	// 必ずクリアしておくこと 
	// 変換文字サンプル
	char t1[] = " Yokohama 045-222-1111  Osaka 06-5555-6666  Tokyo 03-1111-9999 ";
	char patern1[] = "tr/A-Z0-9/a-zx/g";
	int ctr;
	if (ctr = BTrans(patern1,t1,t1+lstrlen(t1),&rxp,msg)) {
		TRACE2("after(%d)=%s\n",ctr,rxp->outp);	// 変換した文字数と文字列
		TRACE1("length=%d\n",rxp->outendp - rxp->outp);	// 変換後の文字数
	}

	if (rxp)				// コンパイルブロックの開放
		BRegfree(rxp);		// 忘れないように


TRACE結果:
after(33)= yokohama xxx-xxx-xxxx  osaka xx-xxxx-xxxx  tokyo xx-xxxx-xxxx 
length=63


BSplit関数のサンプル

電話番号をデリミタとして文字列を分割します。
	static BregPool bpool(8);
	char msg[80];
	char t1[] = " Yokohama 045-222-1111  Osaka 06-5555-6666  Tokyo 03-1111-9999 ";
	char patern1[] = "/ *\\d{2,3}-\\d{3,4}-\\d{4} */";
	BREGEXP *rxp = bpool.Get(patern1);
   	int splitcnt = BSplit(patern1,t1,t1+lstrlen(t1),0,&rxp,msg);
	if (splitcnt > 0 ) {
		int i = 0;
		for (int j = 0;j < splitcnt;j++) {
			int len = rxp->splitp[i+1] - rxp->splitp[i];
			char *tp = (char*)rxp->splitp[i];
			char ch = tp[len]; // save delmitter
			tp[len] = 0;	// set stopper
			TRACE3("len=%d [%d]=%s\n",len,j,tp);
			tp[len] = ch;	// restore the char
			i += 2;
		}
	}

TRACE結果:
len=9 [0]= Yokohama
len=5 [1]=Osaka
len=5 [2]=Tokyo


BREGEXP.DLL の Delphi 用ライブラリ

武内 修 さん作成の Delphi 用[Perl 互換正規表現ユニット]がありますのでご利用ください。
http://home1.infonia.ne.jp/~delphian/delphi/direct.html?id=MI0036 からダウンロードできます。


Linux 用ライブラリ

Linux版ライブラリbregexpは http://www.hi-ho.ne.jp/babaq/linux/bregexplib.html

ご注意

Visual C++以外のコンパイラでの動作確認を行っておりません。

babaqフリーソフトのご使用上の注意

●プログラムを使って発生した損害に関しては、一切の責任を負いません。
●使用、配布に制限はありません。自由にお使いください。
●動作の保証はありません。
●動作を確認したOSは、Windows NT 4.0 とWindows 95/98のみです。

Home


Copyright 1999-2000 Tatsuo Baba,All rights reserved.