2009/01/17 更新
bregonig.dll Ver.1.45 Copyright (C) 2006-2009 K.Takata
1.概要
Tatsuo Baba氏による正規表現ライブラリである Bregexp.dll (*1) 互換
の正規表現ライブラリです。Windows アプリで Perl 互換の正規表現が使え
るようになります。
正規表現エンジンとして鬼車 (Oniguruma) (*2) を採用することにより、
オリジナルの Bregexp.dll よりも高度な正規表現を使用できるようになっ
ています。具体的には、戻り読み (look-behind)《(?<=式), (?<!式)》、式
オプション《(?imsx-imsx:式)》、POSIX ブラケット《[:ascii:]》、文字プ
ロパティ《\p{Ascii}》、名前付き捕獲式集合と名前指定後方参照《(?<name>
式), \k<name>》などが新たに使えるようになります。
K2Editor で使われている K2Regexp.dll (*3) と、サクラエディタで使わ
れている Bregexp.dll for SAKURA (*4) にも対応しています。K2Editor や
サクラエディタなどで、この bregonig.dll を使うことで、検索機能や置換
機能が大幅に強化されます。
(*1) http://www.hi-ho.ne.jp/babaq/bregexp.html
(*2) http://www.geocities.jp/kosako3/oniguruma/index_ja.html
(*3) http://k2top.jpn.org/index.php?K2Editor
(*4) http://sourceforge.net/project/showfiles.php?group_id=12488
2.動作環境
・Windows 98/2000/XP/Vista
(Windows 95/ME/NT4 は動作未確認)
・bregonig.dll または Bregexp.dll に対応したアプリケーション
作者が動作を確認したアプリケーションは以下の通りです。
ただし、動作を保証するものではありません。
・K2Editor r.1.5.7 Build 519 (k2regexp.dll)
・JmEditor2 Version 2.0.25
・サクラエディタ Ver. 1.6.4.0
・Spam Mail Killer Ver.2.28
・INCM version 1.23c
・ttPage-R Ver.0.98r28
・秀丸エディタ Ver7.00 + BRegIf.DLL v0,0,2,2
・Speeeeed Ver1.43
3.インストール
bregonig.dll の名前を bregexp.dll に変更し、それを Bregexp.dll を
使用するアプリケーションと同じフォルダに置いてください。(ただし、ア
プリケーションによってはインストール方法が異なる場合もありますので、
詳細はそれぞれのマニュアルでご確認ください。)
K2Editor の場合は、同梱の k2regexp.dll を K2Editor.exe のあるフォ
ルダにコピーしてください。(K2Regexp.dll は Bregexp.dll を元に作られ
ているものの、オリジナルの Bregexp.dll とは互換性が無いため、別ファ
イルになっています。)
(いずれの場合も、元々のファイルはバックアップしておき、何か問題があ
ればすぐに戻せるようにしておくことをお薦めします。)
4.使用可能な正規表現
オリジナルの Bregexp.dll や、Bregexp.dll for SAKURA と同様に、次に
示す形式でパターンを与えます。
・BMatch(), BMatchEx(), BSplit()
/pattern1/options
m/pattern1/options
・BSubst(), BSubstEx()
s/pattern1/pattern2/options
・BTrans()
tr/pattern3/pattern4/options
Bregexp.dll や Perl と同様に、m//, s///, tr/// の形式の場合には、
パターンの区切り文字には '/' 以外のものを使うこともできます。
('\x01' などのコントロール文字も使用可能。)
なお、Perl とは異なり、s<ptn1>{ptn2}opt のように対応する括弧でくく
ったり、pattern1 と pattern2 を違う文字でくくることはできません。こ
れは Bregexp.dll と同じ動作です。
pattern1 の部分は、Oniguruma の正規表現パターン文法として
ONIG_SYNTAX_PERL_NG を指定した場合の正規表現が利用可能となっており、
基本的には Perl 5.8 とほぼ同じ文法が使えます。ただし、Oniguruma のド
キュメント (*5) にも書かれているように、一部対応していない機能があり
ます。
なお、ONIG_SYNTAX_PERL_NG は「Perl 互換 + 名前付き捕獲式集合」の文
法であるため、Oniguruma のドキュメントに記載されていても Perl で使え
ない機能は基本的に bregonig.dll でも使えません。しかし bregonig.dll
では、利便性のために、異なる文字長の戻り読み、文字集合内の積演算 な
どは例外的に使えるようにしてあります。
以前のバージョンでは、垂直タブを示す \v も使えるようにしてありまし
たが、Perl 5.10 では \v は別の意味を持っていて矛盾するため、この機能
は廃止とします。Ver.2.00 で完全に削除されます。
Ver.2.00 以降では、Perl 5.10 に合わせて、強欲な量指定子が使えるよ
うになります。
(*5) http://www.geocities.jp/kosako3/oniguruma/doc/RE.ja.txt
pattern2, options の部分は bregonig.dll が自前で処理を行っており、
Oniguruma や Bregexp.dll あるいは Perl とは多少仕様が異なっています。
(詳細は後述)
pattern3, pattern4 の部分は、Bregexp.dll のソースをほとんどそのま
ま流用しているため、使えるパターンも Bregexp.dll とほとんど同じです。
(\b, \x{HHHH} が追加されている点が異なります。)
以前のバージョンでは、垂直タブを示す \v も使えるようにしてありまし
たが、Perl 5.10 との混乱を避けるため、この機能は廃止とします。
Ver.2.00 で完全に削除されます。
options は、次のものが指定できます。
i 大文字小文字を区別しない
k 文字を日本語(SJIS)として扱う (Bregexp.dll 独自拡張)
m '^', '$' が文字列中の改行直後・直前にマッチする
s '.' が改行にマッチする
g 置換:グローバルな置換
c 変換:SEARCHLIST を補集合にする
d 変換:見つかったが置換されなかった文字を削除する
s 変換:置換された文字が重なったときに圧縮する
x 拡張正規表現を使用する
Bregexp.dll に比べて、BMatch(), BSubst(), BSplit() で s と x が使え
るように拡張されています。なお、x は pattern1 にのみ効果があり、
pattern2 には効果はありません。
pattern2 で使用可能な特殊文字は以下の通りです。
\t 水平タブ (0x09)
\n 改行 (0x0A)
\r 復帰 (0x0D)
\b 後退空白 (0x08)
\f 改頁 (0x0C)
\a 鐘 (0x07)
\e 退避修飾 (0x1B)
\nnn 八進数表現 符号化バイト値(の一部)
\xHH 十六進数表現 符号化バイト値(の一部)
\x{HHHH} 拡張十六進数表現 コードポイント値 (SJIS)
\cx \c\x 制御文字表現 コードポイント値
Bregexp.dll に対して \b, \x{HHHH} が追加されています。また、\nnn の
扱いが一部変更されています。(後述)
Perl では、\x{HHHH} は Unicode での文字コードを指定しますが、
bregonig.dll の現バージョンでは、Shift_JIS での文字コードとなってい
ます。
以前のバージョンでは、垂直タブを示す \v が使えるようにしてありまし
たが、Perl 5.10 との混乱を避けるため、この機能は廃止とします。
Ver.2.00 で完全に削除されます。
現バージョンでは、\L, \U, \l, \u などは使用できません。
pattern2 における部分文字列の参照には以下のものが使用できます。
\n $n ${n} 番号指定参照 (n は 1 以上の 10進整数)
$& マッチした文字列全体
$+ 最後にマッチした部分文字列
\k<name> 名前指定参照 (Oniguruma 準拠)
\k'name' 同上
${name} 名前指定参照 (bregonig.dll 独自拡張、暫定仕様)
$+{name} 名前指定参照 (Perl 5.10 準拠)
$-{name}[n] 名前 + 番号指定参照 (Perl 5.10 準拠)
Bregexp.dll では \n, $n, $& が使えましたが、bregonig.dll では ${n},
$+ と名前指定参照が追加されています。${n} が追加されたことにより、
s/(hoge.)/${1}2/g
など、番号指定参照の後に続けて数字を書くことが可能になります。
Bregexp.dll では、これは、
s/(hoge.)/$1\x32/g
などと書く必要がありました。('\x32' は '2' の十六進数表現)
Perl とは異なり、$`, $', $^N は使えません。また、Perl では $var な
どと書くと変数が展開されますが、bregonig.dll ではこれはただの文字列
として扱われます。また、Perl では $0 は、実行中のスクリプト名を表し
ますが、bregonig.dll ではこれもただの文字列として扱われます。
Ver.1.40 以降では、$+ で最後にマッチした部分文字列を取り出せます。
例えば、(a)|([^a]) というパターンに対して、$+ を使うと、$1 と $2 の
どちらかマッチした方の文字列が取り出せます。
Perl では、${${1}} などのように番号指定参照などを入れ子にすること
もできますが、bregonig.dll は、これには対応していません。(有用性が
不明なため。)
Bregexp.dll には、pattern2 の末尾が $ で終わっていると、これが \
に変換されてしまうというバグがありますが、bregonig.dll ではこれは修
正されています。
pattern2 の名前指定参照では、Oniguruma 準拠の \k<name>, \k'name'
形式と、bregonig.dll 独自の ${name} 形式と、Perl 5.10 準拠の
$+{name}, $-{name}[n] 形式が使えます。
Perl で ${name} と記述した場合には、変数 $name の中身が展開されま
すが、bregonig.dll では変数が使えないので、代わりに現バージョンでは
${name} を名前指定参照に割り当ててあります。ただし、この仕様は暫定的
なものであり、今後変更される可能性もあります。
Ver.1.40 以降では Perl 5.10 準拠の $+{name}, $-{name}[n] 形式での
名前指定参照も使えるようになりました。ただし、Perl 5.10 とは、同じ名
前で重複して定義されていた場合の挙動が異なります。Perl 5.10 では、
$+{name} は、最も左の結果が取り出せますが、bregonig.dll では、最も右
の結果が取り出されます。$-{name}[n] を使うと、同じ名前の n 番目のマ
ッチ結果が取り出せます。n に 0 を指定すると最も左のマッチ結果が取り
出され、-1 を指定すると最も右のマッチ結果が取り出されます。(同名で
重複定義されたときの、$+{name} の Perl 5.10 との挙動の違いは
Ver.2.00 で修正される予定です。)
・pattern2 における \nnn の扱いについて
Perl では、nnn の数字に対応する括弧の組があれば、\10, \11 などで
参照できますが、対応する括弧の組がなければ、\10 は \010 (バックス
ペース) として扱われ、\11 は \011 (タブ) のようになります。しかし
Bregexp.dll ではこれとは異なり、対応する括弧の組の有無に関わらず、
nnn の最初の数字が 0 の場合には常に文字の八進数表現として扱い、nnn
の最初の数字が 1〜9 の場合には常に後方参照となるようになっています。
そのため、Bregexp.dll では \077 より大きな文字は \nnn 形式では表現
できず、\xHH 形式を使わなければいけません。
bregonig.dll では、Ver.0.09 までは Bregexp.dll の仕様に合わせて
ありましたが、Ver.0.10 以降では Perl の仕様にほぼ合わせてあります。
ただし、\18 などのように数字の後ろに八進数で使えない数字が続く場合、
Perl では括弧の数に応じて ${1}8 あるいは ${18} として扱われますが、
bregonig.dll では常に ${18} として扱われます。(将来的には、これも
Perl の仕様に完全に合わせたいと考えています。)
・非互換点
・オプションで k (日本語モード) を指定すると、\w は [A-Za-z0-9_]
だけでなく、2バイト文字(漢字等)にもマッチするようになります。
一方、Bregexp.dll では、オプション k の有無に関わらず、\w は
[A-Za-z0-9_] と同義です。なお、Perl 5.8 でも、検索対象が Unicode
文字列(utf8 フラグがオン)ならば、\w は多バイト文字にもマッチし
ます。
・文字集合内で演算子を使えるように仕様変更したことにより、[ ] の中
に [ を書くときは必ず \[ のようにエスケープしなければならなくな
りました。(Ver.1.30 以降)
5.制限事項・注意事項
現バージョンでは、Visual Basic 用の API は実装されていません。VB
製のアプリケーションから使用する場合は、オリジナルの Bregexp.dll を
お使いください。
Oniguruma 自体は各種文字エンコーディングに対応していますが、
bregonig.dll は Bregexp.dll との互換性のため、ASCII と Shift_JIS 以
外の文字エンコーディングは使用できません。(Ver.2.00 以降では、
UTF-16LE も使えるようになります。)
bregonig.dll は十分テストしてあるつもりですが、オリジナルの
Bregexp.dll との互換性に問題があったり、バグが残っている可能性もあり
ます。実際に使用する際には、事前に十分にテストを行うことをお薦めしま
す。(バグを見つけた際には報告をお願いします。)
一応、マルチスレッドライブラリを用いてコンパイルしてありますが、本
当にマルチスレッドで使えるかどうかは確認していません。
Ver.1.xx は Perl 5.8 互換、Ver.2.xx は Unicode 対応 API + Perl
5.10 互換(ただし、名前指定参照は Oniguruma 形式)という方向で開発を
進めていく予定です。
6.コンパイル方法
コンパイラは Visual C++ 6.0 以降に対応しています。
同梱の Oniguruma マルチスレッド対応 & 設定変更 & \G 動作変更パッチ
(onig-5.9.1-mod.diff) を使って、Oniguruma にパッチを当ててからコンパ
イルしてください。なお、Oniguruma マルチスレッド対応パッチは OnigPP
(*6) を参考にしています。
(*6) http://www.void.in/wiki/OnigPP
手順例)
.\bregonig\ に bregonig.dll のソースと前述のパッチがあり、
.\onig-x.y.z\ に Oniguruma のソースがあるものとします。(x.y.z の部
分はバージョンに合わせて読み替えてください。)
> cd onig-x.y.z
> patch -p1 -T < ../bregonig/onig-x.y.z-mod.diff
> copy win32\*.* .
> nmake onig_s.lib "CFLAGS=/O2 /W3 /MT /DONIG_EXTERN=extern"
> cd ..\bregonig
> nmake ONIG_DIR=../onig-x.y.z
Oniguruma のコンパイル時に、VS2005 以降を使うときは CFLAGS に
/D_CRT_SECURE_NO_DEPRECATE を追加しておくと、余計な warning が減りま
す。また、/nologo を追加しておくのも良いでしょう。
7.更新履歴
2006/08/24 Ver.0.01
・最初の公開バージョン。
・Oniguruma 4.3.1 を使用。
2006/08/25 Ver.0.02
・k2regexp.dll で BMatch() の one_shot モードに対応。
・正規表現パターン文法を ONIG_SYNTAX_PERL から
ONIG_SYNTAX_PERL_NG に変更。これにより名前付き捕獲式集合が使用
可能に。
・暫定的に、戻り読みで長さの異なる文字列を指定可能に。(今後変更
される可能性あり)
例. (?<=a|bc)
・Oniguruma 4.4.0 を使用。
2006/08/27
・パターンとして空文字列を渡したときに、BMatch() や BSubst() で
文字列の先頭にマッチしていたのをマッチしないように変更。(オリ
ジナルの Bregexp.dll の挙動にあわせるため。)
2006/08/28 Ver.0.03
・K2Editor などで置換で落ちる場合があった重大バグを修正。
・BSplit() を実装。
・Oniguruma 4.4.0 を使用。
2006/08/29 Ver.0.04
・BTrans() を実装。
・BRegexpVersion() が返すバージョン番号を更新するのを忘れていた
ので、更新。
・Oniguruma 4.4.0 を使用。
2006/08/30 Ver.0.05
・メモリ不足のときのエラー処理を見直し。
・バージョンリソースを付加。
・Oniguruma 4.4.1 を使用。
2006/08/31 Ver.0.06
・サクラエディタで大きなファイルに対して「すべて置換」「すべて行
置換」を実行すると落ちる場合があるので、とりあえず暫定的に対策。
詳細は調査中。
・Oniguruma の API をエクスポートしないように変更。
・Oniguruma 4.4.1 を使用。
2006/09/02 Ver.0.07
・Ver.0.06 での対策を少し変更。
・コンパイル手順の例を加筆。
・Oniguruma 4.4.1 を使用。
2006/09/04
・Spam Mail Killer で動作確認。
2006/09/06
・DLL アンロード時に onig_end() を呼び出すように変更。
2006/09/07
・INCM で動作確認。
・ソース上の細かい修正。
2006/09/09 Ver.0.08
・鬼車の更新により、サクラエディタで落ちる問題が解消された。
(Ver.0.06 での暫定的な対策をしっかりしたものに変更。)
・鬼車の更新により、否定戻り読みの中で肯定戻り読みが使えるように
なった。可変長の戻り読みを使う場合は、代わりにこちらを使うこと
を推奨。(Perl との互換性のため)
例. (?<!(?<=a)b|c)
・Oniguruma 4.4.2 を使用。
2006/09/12 Ver.0.09
・pattern2 での \c\x の扱いを pattern1 の鬼車の仕様に合わせるよ
うに変更。(現バージョンでは、pattern3, pattern4 に関しては以
前の仕様のまま。)(今後変更される可能性あり)
例. \c\[ == \c[ == Ctrl-[ == \x1B (pattern1, 2)
\c\[ == Ctrl-\ + [ == \x1C\x5B (pattern3, 4)
・Oniguruma 4.4.2 を使用。
2006/09/14 Ver.0.10 (非公開)
・pattern2 で \nnn の仕様を Bregexp.dll から Perl に合わせるよう
に変更。(これに合わせて、subst.cpp を大幅書き換え。)
・Oniguruma 4.4.2 を使用。
2006/09/14 Ver.0.11
・pattern2 で \0nn が機能していなかったバグを修正。
・pattern2 で名前参照が使えるようになった。(ただし今後仕様が変
更される可能性あり)
・Ver.0.10 で ${n} が使えなくなっていたバグを修正。
・Oniguruma 4.4.2 を使用。
2006/09/16 Ver.0.11a (非公開)
・ドキュメント修正。
・Oniguruma 4.4.3 を使用。
2006/09/18 Ver.0.11b
・ファイルサイズを 15KiB 削減。
・Oniguruma 4.4.3 を使用。
2006/10/20
・Oniguruma 5.0.0 を使用。
・Oniguruma にバグがあったため、非公開。
2006/10/27 Ver.1.00
・試作版から正式版に昇格。
・Oniguruma 5.0.1 を使用。これにより、[:word:], \p{Word} が使用
可能になった。
2006/11/05 Ver.1.01
・Win9x でサクラエディタの終了時に落ちることがあったバグを修正。
・Oniguruma 5.0.1 を使用。
2006/11/09
・Oniguruma 5.1.0 を使用。
2006/11/14 Ver.1.10
・Oniguruma 5.2.0 を使用。([:punct:] 修正。)
2006/11/22 Ver.1.20
・Oniguruma 5.3.0 を使用。(\p{Hiragana}, \p{Katakana} が使用可
能に。)
2007/01/21 Ver.1.21
・Oniguruma 5.5.2 を使用。
2007/06/23 Ver.1.30
・Oniguruma 5.8.0 を使用。(pattern1 で \k'name' が使用可能に。)
・pattern2 で \k'name' を使えるように改良。
・pattern1 で \v が使えなかった問題を修正。(ONIG_SYNTAX_PERL_NG
では本来使えないが、利便性のため。)
・pattern1 で、文字集合に [a-w&&[^c-g]z] などの表記が使えるよう
に仕様変更。(ONIG_SYNTAX_PERL_NG では本来使えないが、利便性の
ため。)
・pattern2 で \x{HHHH} が使えなかったバグを修正。
・pattern3,4 で \nnn が正常に使えなかったバグを修正。
(Bregexp.dll からのバグ)
・pattern3,4 で \x{HHHH} を使えるように改良。
・pattern2 に、\xQQ, \x{12{, ${3{ などのような不正なパターンを指
定した場合の挙動を修正。今までは動作は不定だったが、できるだけ
そのままの文字列として扱うようにした。(Perl とは異なり、エラ
ーとはならない。)
2007/06/26 Ver.1.31
・Oniguruma 5.8.0 改変版を使用。(非マルチラインモードで $ が改
行の直前にマッチしないバグを修正。)
2007/07/15 Ver.1.31a
・ドキュメントの見直し。(曖昧な表現の修正、説明の追加など)
・(bregonig.dll, k2regexp.dll 自体の変更は無し。)
2007/08/04 Ver.1.32
・マッチ長が 0 バイトのとき、BSubst() で置換が出来なかったバグを
修正。
・BREGEXP 構造体の startp, endp 配列の中身に不正な値が設定される
場合があったバグを修正。((a)|(b) のようなパターンを与えた場合、
マッチしなかった方に不正な値が入っていた。)
・垂直タブを意味する \v を廃止した。(Perl 5.10 と矛盾するため。)
・Ver.2.00 での仕様変更が決定している事項について言及。
・Ver.1.10 以降でマルチスレッド対応が無効になっていたバグを修正。
・Oniguruma 5.9.0 を使用。(高速化のため一部設定変更)
2007/08/26 Ver.1.40
・ソースを Ver.2.00 系列と統一。(サンプルファイル含む)(これに
より、bregexp.h をインクルードする前に tchar.h または
windows.h をインクルードしなければならなくなった。)
・$+, $+{name}, $-{name}[n] を使えるようにした。
・検索パターン (pattern1) で名前付き捕獲と名前無し捕獲の同時使用
ができるように仕様を変更。
・ドキュメントの見直し。
・Oniguruma 5.9.0 を使用。(設定をさらに変更)
2007/08/28 Ver.1.41
・BRegIf.DLL で、;n 形式が使えなかったバグを修正。(検索に失敗し
たときに、nparens に値が設定されていなかった。)
・Oniguruma 5.9.0 を使用。(設定変更版)
2007/08/29 Ver.1.41a
・ドキュメントのミスを修正。
・(bregonig.dll, k2regexp.dll 自体の変更は無し。)
2007/09/28 Ver.1.42
・BREGEXP 構造体の rsv1 の型を int から INT_PTR に変更。(これに
より、bregexp.h をインクルードする前に windows.h をインクルー
ドしなければならなくなった。)(64bit化を考慮しての変更。現行
の 32bit版の動作には影響なし。)
・BSubst() で g オプションと \G を使用した際の動作が、
Bregexp.dll と異なる場合があったのを修正。
・BSubst() でゼロ幅マッチ時に2バイト文字を正しく扱えない場合が
あったのを修正。
・Oniguruma 5.9.0 改変版を使用。(\G 対応のための改変)
2008/03/12 Ver.1.43
・Oniguruma 5.9.1 改変版を使用。(\G 対応のための改変)
- 大文字小文字を区別しないときに、否定文字集合が正しく動かない
のを修正。
- pattern1 で \k<n> などの番号指定参照に対応。
2008/10/12 Ver.1.44
・BTrans() で c オプションが効かない場合があったのを修正。
(h-tomさん、ありがとうございます。)
2008/10/15 Ver.1.45 (非公開)
・DLL のベースアドレスをデフォルト値から変更。(DLL のロード高速
化やシステム全体で見たときのメモリ使用量削減が期待できる。)
2009/01/17 Ver.1.45
・デバッグ用コードが残っていたのを削除。
・コンパイルオプションの見直しにより、ファイルサイズを削減。
・bsd_license.txt に、Oniguruma の最新版のライセンスを反映。
8.ライセンス
bregonig.dll のライセンスは Bregexp.dll 同様に Perl と同じライセン
ス、すなわち GPL と Artistic License のどちらかを選択できるものとし
ます。Artistic License は同梱の perl_license.txt,
perl_license_jp.txt を参照してください。
また、bregonig.dll は、正規表現ライブラリとして Oniguruma を使用し
ており、Oniguruma は BSD ライセンスとなっています。また、ソースファ
イルの一部にも BSD ライセンスのものが含まれています。同梱の
bsd_license.txt を参照してください。再配布などの際には、BSD ライセン
スに従い、bsd_license.txt も同梱してください。(ドキュメントに
bsd_license.txt の内容を転記でも可)
9.謝辞
すばらしいライブラリを作られた以下の各氏に感謝します。
K.Kosako氏 (Oniguruma)
Tatsuo Baba氏 (Bregexp.dll)
Koyabu Kazuya(K2)氏 (K2Regexp.dll)
かろと氏 (Bregexp.dll for SAKURA)
10.連絡先
作者: K.Takata (高田 謙)
E-mail: kentkt ATMARK csc DOT jp
URL: http://webs.to/ken/
http://homepage3.nifty.com/k-takata/