[前][次][番号順一覧][スレッド一覧]

mysql:2947

From: とみたまさひろ <とみたまさひろ <tommy@xxxxxxxxxx>>
Date: Sat, 6 Jan 2001 03:54:46 +0900
Subject: [mysql 02947] 日本語正規表現 UDF

とみたです。

MySQL で日本語の正規表現が使えないことについて、日本語だけでなくて
マルチバイト汎用にできないものかと色々と考えてたんですが、諦めました (^^;

で、次に日本語だけに対応させようと思って、MySQL のソースを眺めてたん
ですが、現在の REGEXP, RLIKE 演算子をパッチ等で日本語対応にするという
のも、やはり諦めました (^^;;

# 正規表現のソースはわけわからん… (--;

で、UDF(ユーザ定義関数)ならなんとかなるかな? ということで、Ruby の
正規表現処理部分をそっくりそのまま流用して UDF を作ってみました。

添付の jregexp.c と config.h と、Ruby 1.6.2 のソース中の regex.c と 
regex.h を適当なディレクトリにコピーして、

  % gcc -I /usr/local/include/mysql -shared -o jregexp.so jregexp.c regex.c

で作られる jregexp.so を適当な場所(/usr/local/lib/mysql とか)において、

  # env LD_LIBRARY_PATH=/usr/local/lib/mysql /etc/rc.d/init.d/mysql start

として MySQL サーバを起動します。その後 mysql -uroot で

  mysql> create function jregexp returns integer soname "jregexp.so";

とすれば、サーバに jregexp 関数が組み込まれます。

使い方は

	jregexp("文字列", "正規表現" [, オプション])

です。文字列が正規表現に適合すれば 1、しなければ 0 を返します。
オプションは次の数値を論理和で指定します。指定しない場合は 1 です。

	1  RE_OPTION_IGNORECASE /* match will be done case insensetively */
	2  RE_OPTION_EXTENDED   /* perl-style extended pattern available */
	4  RE_OPTION_MULTILINE  /* newline will be included for . */
	8  RE_OPTION_SINGLELINE /* ^ and $ ignore newline */
	16 RE_OPTION_LONGEST    /* search for longest match, in accord with POSIX regexp */

# それぞれのオプションの意味は良くわかりません (^^;

	mysql> select jregexp("あいうえお", "い.え")  ==> 1
	mysql> select jregexp("ほげえええ", "ほげえ+$") ==> 1

対応しているのは日本語EUCだけです。SJIS で使いたい人は jregexp.c の
MBCTYPE_EUC を MBCTYPE_SJIS に変更すれば使えるかもしれませんが、試して
ません。

Ruby のソースを持っていない人のために、ファイル一式を
	http://www.tmtm.org/ja/mysql/jregexp.tar.gz
においておきました。

作っておいてなんですが、私は MySQL で正規表現はほとんど使わないんで、
誰か評価してください (^^;;

問題なければ、ドキュメントを適当に書いて MyNA の Web にでも載せたいと
思います。

---
とみたまさひろ <tommy@xxxxxxxxxx>
日本MySQLユーザ会 http://www.mysql.gr.jp

[前][次][番号順一覧][スレッド一覧]

->    2947 2001-01-06 03:54 [とみたまさひろ <tomm] 日本語正規表現 UDF                      
   @  2948 2001-01-06 03:59 ┗[とみたまさひろ <tomm]