正規表現ライブラリ bregonig.dll

2013/07/07 更新

ダウンロード

ソースコードは、GitHub 上で公開しています。

目次

1. 概要

 Tatsuo Baba氏による正規表現ライブラリである Bregexp.dll 互換の正規表現ライブラリです。Windows アプリで Perl 互換の正規表現が使えるようになります。

 正規表現エンジンとして、鬼車 (Oniguruma) を改良した鬼雲 (Onigmo, Oniguruma-mod) を採用することにより、オリジナルの Bregexp.dll よりも高度な正規表現を使用できるようになっています。具体的には、戻り読み (look-behind) 《(?<=式), (?<!式)》、式オプション 《(?imsx-imsx:式)》、POSIX ブラケット 《[:ascii:]》、文字プロパティ 《\p{Ascii}》、名前付き捕獲式集合と名前指定後方参照 《(?<name>式), \k<name>》 などが新たに使えるようになります。

 K2Editor で使われている K2Regexp.dll と、サクラエディタで使われている Bregexp.dll for SAKURA にも対応しています。K2Editor やサクラエディタなどで、この bregonig.dll を使うことで、検索機能や置換機能が大幅に強化されます。

2. 動作環境

3. インストール

 32bit アプリには、アーカイブを解凍した直下のディレクトリにあるファイルを、64bit アプリには、x64 ディレクトリにあるファイルをお使いください。

3.1. bregonig.dll に標準で対応しているアプリケーションの場合

 サクラエディタ 1.6.0 以降など、bregonig.dll に標準で対応しているアプリケーションの場合は、bregonig.dll をそのままアプリケーションと同じ場所に置いてください。(ただし、アプリケーションによってはインストール方法が異なる場合もありますので、詳細はそれぞれのマニュアルでご確認ください。)

 使用している OS に関わらず、アプリケーションが 32bit 版の場合は 32bit 版の bregonig.dll を、アプリケーションが 64bit 版の場合は 64bit 版の bregonig.dll をお使いください。64bit 版の bregonig.dll は、アーカイブファイルを解凍した先の x64 フォルダの中に入っています。

3.2. bregonig.dll に標準で対応していないアプリケーションの場合

 Bregexp.dll に対応しているが、bregonig.dll には標準で対応していないアプリケーションの場合、bregonig.dll の名前を bregexp.dll に変更し、それをアプリケーションと同じフォルダに置いてください。(ただし、アプリケーションによってはインストール方法が異なる場合もありますので、詳細はそれぞれのマニュアルでご確認ください。)

3.3. K2Editor の場合

 K2Editor の場合は、同梱の k2regexp.dll を K2Editor.exe のあるフォルダにコピーしてください。(K2Regexp.dll は Bregexp.dll を元に作られているものの、オリジナルの Bregexp.dll とは互換性が無いため、別ファイルになっています。)

(いずれの場合も、元々のファイルはバックアップしておき、何か問題があればすぐに戻せるようにしておくことをお薦めします。)

4. API

4.1. Bregexp.dll 互換 API (ANSI/Shift_JIS)

以下の Bregexp.dll 互換の API が使用できます。

また、以下の Bregexp.dll for SAKURA 互換の API も使用できます。

4.2. Unicode 版 API

 bregonig.dll Ver.2 以降では、4.1. の各 API について、Unicode (UTF-16LE) 版 API が用意されています。以下のいずれかの方法で使用できます。

4.2.1. 暗黙的リンク

 以下のように、UNICODE, _UNICODE を定義した状態で、同梱の src.7z に入っている bregexp.h をインクルードし、bregonig.lib をリンクすることで Unicode 版 API が使用できるようになります。(Bregexp.dll に付属の bregexp.h は不可)

#define UNICODE
#define _UNICODE
#include "bregexp.h"

4.2.2. 明示的リンク

 LoadLibrary(), GetProcAddress() を使って明示的リンクをする場合は、API 名の末尾に W を付けた名前を使って、GetProcAddress() を呼ぶことで、Unicode 版 API の関数アドレスを取得できます。

hBregOnig = LoadLibrary(_T("bregonig.dll"));
pBMatch = GetProcAddress(hBregOnig, "BMatchW");
pBRegfree = GetProcAddress(hBregOnig, "BRegfreeW");

4.2.3. 注意事項

4.3. bregonig.dll 独自 API

 Ver.3 から、新たに 2つの API を公開しており、それぞれ Unicode 版と ANSI 版が用意されています。

 従来の API では、検索・置換パターンを m/pattern1/optionss/pattern1/pattern2/options のように単一の文字列で指定していましたが、新 API では、pattern1, pattern2, options をそれぞれ個別の文字列で指定します。従来 API とは異なり、パターンを "/" で囲ってはいけません。その代わり、パターンに "/" が含まれる場合でもエスケープする必要はありません。

 従来の API とは異なり、各 API の検索対象文字列について、空文字列を受け付けるようになっています。

4.3.1. 検索

関数宣言
#include "bregexp.h"

int BoMatch(const TCHAR *patternp, const TCHAR *optionp,
            const TCHAR *strstartp,
            const TCHAR *targetstartp, const TCHAR *targetendp,
            BOOL one_shot,
            BREGEXP **rxp, TCHAR *msg);
引数
patternp
検索パターン(NUL 文字終端) (5.1. 参照)
NULL を指定すると、前回のコンパイル済みパターンを使用する。
optionp
オプション(NUL 文字終端) (下記参照)
patternpNULL の場合は無視される。不要時は空文字または NULL を指定する。
strstartp
検索対象文字列(NULL 不可)
targetstartp
検索開始位置(NULL 不可)
targetendp
検索終了位置(NULL 不可)
one_shot
TRUE
ワンショットモード
検索開始位置で検索パターンがマッチするか調べる。
FALSE
通常モード
rxp
BREGEXP 構造体ポインタ (rx) へのポインタ
初回呼び出し時は BREGEXP 構造体ポインタ (rx) を NULL で初期化しておかなければならない。
使用終了後は、BRegfree() で解放すること。
msg
エラーメッセージの格納先(NULL 不可)
終端の NUL 文字を含めて BREGEXP_MAX_ERROR_MESSAGE_LEN (= 80) 文字分の領域が必要
戻り値
エラー
0
マッチ失敗
マッチ成功
検索結果
rx->nparen
パターンの中の () の数 (*1)
rx->start[0]
マッチ範囲の開始位置 (*2)
rx->end[0]
マッチ範囲の終了位置 (*2)
rx->start[n]
$n の開始位置 (1 <= n <= nparen) (*2) (*3)
rx->end[n]
$n の終了位置 (1 <= n <= nparen) (*2) (*3)
(*1)
パターンのコンパイルが成功していれば、マッチの失敗・成功に関わらず有効な値が入る。
(*2)
マッチ成功時のみに有効な値が入る。
(*3)
マッチしなかった部分には NULL が入る。例えば "(a)|(b)" というパターンを "b" にマッチさせた場合、$1 にはマッチしないため、rx->start[1] == rx->end[1] == NULL となる。
オプション
Perl 5.8 互換オプション
i
大文字小文字を区別しない
m
^, $ が文字列中の改行直後・直前にマッチする
s
. が改行にマッチする
g
置換:グローバルな置換
x
拡張正規表現を使用する
文字コードオプション(ANSI API のみ)
k
文字を日本語(Shift_JIS)として扱う (Bregexp.dll 独自拡張)
8
文字を UTF-8 として扱う (bregonig.dll 独自拡張)
Unicode API では、オプションの指定に関わらず UTF-16LE として扱う
Perl 5.14 互換文字セット修飾子(限定サポート)
a
ASCII
\d, \s, \w, POSIX ブラケットのマッチ範囲を ASCII 内に制限する
u
Unicode
Unicode API (UTF-16LE):
\d, \s, \w, POSIX ブラケットのマッチ範囲は Unicode に準拠する
ANSI API (8 オプション指定時 (UTF-8)):
\d, \s, \w, POSIX ブラケットのマッチ範囲は Unicode に準拠する
ANSI API (k オプション指定時 (Shift_JIS)):
\w と POSIX ブラケットの一部は、多バイト文字にマッチする
ANSI API (8, k オプション無指定時 (ASCII)):
\d, \s, \w, POSIX ブラケットのマッチ範囲は ASCII 内に制限される
d
(Default: 現バージョンでは u と同義)
l
(Locale: 現バージョンでは u と同義)
改行コードオプション
R
LF だけでなく、CRLF も改行として扱う (bregonig.dll 独自拡張)
., ^, $, \Z の動作が変更される。

4.3.2. 置換

関数宣言
#include "bregexp.h"

int BoSubst(const TCHAR *patternp, const TCHAR *substp, const TCHAR *optionp,
          const TCHAR *strstartp,
          const TCHAR *targetstartp, const TCHAR *targetendp,
          BCallBack callback,
          BREGEXP **rxp, TCHAR *msg);
引数
patternp
検索パターン(NUL 文字終端) (5.1. 参照)
NULL を指定すると、前回のコンパイル済みパターンを使用する。
substp
置換パターン (NUL 文字終端) (5.3. 参照)
NULL を指定すると、前回のコンパイル済みパターンを使用する。
optionp
オプション(NUL 文字終端) (4.3.1. のオプション項目参照)
patternpNULL の場合は無視される。 不要時は空文字または NULL を指定する。
strstartp
置換対象文字列(NULL 不可)
targetstartp
置換開始位置(NULL 不可)
targetendp
置換終了位置(NULL 不可)
callback
コールバック関数へのポインタ。(4.3.3. 参照)
不要時は NULL を指定すること。
rxp
BREGEXP 構造体ポインタ (rx) へのポインタ
初回呼び出し時は BREGEXP 構造体ポインタ (rx) を NULL で初期化しておかなければならない。
使用終了後は、BRegfree() で解放すること。
msg
エラーメッセージの格納先(NULL 不可)
終端の NUL 文字を含めて BREGEXP_MAX_ERROR_MESSAGE_LEN (= 80) 文字分の領域が必要
戻り値
エラー
0
置換失敗
置換成功
置換結果
rx->outp
置換結果の先頭(置換成功時のみ有効)
rx->outendp
置換結果の末尾(置換成功時のみ有効)

 置換結果は NUL 文字終端されているため、置換結果に NUL 文字が含まれていないことが分かっているのであれば、rx->outendp を参照する必要はありません。

検索結果

 検索結果も、BoMatch() 同様に有効です。

補足

 BoMatch() で検索後、同じパターンを用いて BoSubst() で置換を行う場合は、patternp, optionpNULL を渡すことで、パターンのコンパイルを省略することができます。その際、substp の指定は必須です。逆に、BoSubst() で置換後、同じパターンを用いて BoMatch() で検索することもできます。

 BoSubst() で置換時、patternpNULL を指定し substpNULL 以外を指定することで、前回の patternp のコンパイル結果を流用することができます。しかし逆に patternpNULL 以外を指定し substpNULL を指定することはできません。

4.3.3. コールバック関数

 g オプションを指定し、1つの文字列に対して複数回置換を行う場合に、コールバック関数を用いて進捗を調べたり、置換を中断することができます。

関数形式
typedef BOOL (__stdcall *BCallBack)(int kind, int value, ptrdiff_t index);
引数
kind
0 固定
value
置換回数
index
置換位置
戻り値
TRUE
処理継続
FALSE
処理中断

5. 使用可能な正規表現

 オリジナルの Bregexp.dll や、Bregexp.dll for SAKURA 互換 API については、従来と同様に、次に示す形式で検索・置換・変換パターンを与えます。

BMatch(), BMatchEx(), BSplit()
/pattern1/options
m/pattern1/options
BSubst(), BSubstEx()
s/pattern1/pattern2/options
BTrans()
tr/pattern3/pattern4/options
y/pattern3/pattern4/options (Ver.3 以降)

 Bregexp.dll や Perl と同様に、m//, s///, tr///, y/// の形式の場合には、パターンの区切り文字には / 以外のものを使うこともできます。(\x01 などのコントロール文字も使用可能。)

 なお、Perl とは異なり、s<ptn1>{ptn2}opt のように対応する括弧でくくったり、pattern1pattern2 を違う文字でくくることはできません。これは Bregexp.dll と同じ動作です。

 pattern2, options の部分は bregonig.dll が自前で処理を行っており、Onigmo や Bregexp.dll あるいは Perl とは多少仕様が異なっています。(詳細は後述)

 pattern3, pattern4 の部分は、Bregexp.dll のソースをほとんどそのまま使用しているため、使えるパターンも Bregexp.dll とほとんど同じです。(\b, \x{HHHH} が追加されている点が異なります。)  以前のバージョンでは、垂直タブを示す \v も使えるようにしてありましたが、Perl 5.10 との混乱を避けるため、この機能は Ver.2 で削除されました。また、オリジナルの Bregexp.dll と同様に、tr/あ-Z/x/ などのように文字コードの範囲が 256 以上となるような指定はできません。

5.1. 検索パターン

 pattern1 の部分は、Onigmo の正規表現パターン文法として ONIG_SYNTAX_PERL を指定した場合の正規表現が利用可能となっており、基本的には Perl 5.14 とほぼ同じ文法が使えます。ただし、Onigmo のドキュメント5.1.11. にも記載しているように、一部対応していない機能があります。

 なお、ONIG_SYNTAX_PERL は「Perl 互換」の文法であるため、Onigmo のドキュメントに記載されていても Perl で使えない機能は基本的に bregonig.dll でも使えません。しかし bregonig.dll では、利便性や旧バージョンとの互換性のために、異なる文字長の戻り読み、文字集合内の積演算、\g<> による部分式呼出し などは例外的に使えるようにしてあります。

 以前のバージョンでは、垂直タブを示す \v も使えるようにしてありましたが、Perl 5.10 では \v は別の意味を持っていて矛盾するため、この機能は Ver.2 で削除されました。

5.1.1. 基本要素

\ 退避修飾 (エスケープ)
正規表現記号の有効/無効の制御
| 選択子
(...) 式集合 (グループ)
[...] 文字集合 (文字クラス)

5.1.2. 文字

\t水平タブ (0x09)
\n改行 (0x0A)
\r復帰 (0x0D)
\b後退空白 (0x08)
文字集合の中でのみ有効。
\f改頁 (0x0C)
\a鐘 (0x07)
\e退避修飾 (0x1B)
\nnn8進数表現 (符号化バイト値(の一部))
1〜3桁
\xHH16進数表現 (符号化バイト値(の一部))
1〜2桁
\x{HHHH}拡張16進数表現 (コードポイント値)
1〜4桁、あるいは 1〜6桁
\cx制御文字表現 (コードポイント値)

5.1.3. 文字種、文字の並び、特殊記号

文字種
.任意文字 (改行を除く)
\w単語構成文字
\W非単語構成文字
\s空白文字
\S非空白文字
\d10進数字
\D非10進数字
\p{property-name}
\p{^property-name} (否定)
\P{property-name} (否定)
文字プロパティ (Ver.3 で強化)
全てのエンコーディング:
Alnum, Alpha, Blank, Cntrl, Digit, Graph, Lower, Print, Punct, Space, Upper, XDigit, Word, ASCII
UTF-16LE, UTF-8:
Unicode 6.0 に対応。(プロパティ名の一覧は Onigmo の UnicodeProps.txt を参照)
Shift_JIS:
Hiragana, Katakana に加え、以下のプロパティ名に対応。
Han, Latin, Greek, Cyrillic
現バージョンでは、Perl とは異なり、property-name が 1文字の場合でも、{ } を省略することはできません。
文字の並び
\R改行文字 (Linebreak) (Ver.3 以降)
改行1つにマッチします。
UTF-16LE, UTF-8:
(?>\x0D\x0A|[\x0A-\x0D\x{85}\x{2028}\x{2029}])
ASCII, Shift_JIS:
(?>\x0D\x0A|[\x0A-\x0D])
文字集合内では使用不可
\XeXtended grapheme cluster (Ver.3 以降)
Unicode の結合文字を考慮した1文字にマッチします。
UTF-16LE, UTF-8:
(?>\P{M}\p{M}*)
ASCII, Shift_JIS:
(?s:.)
文字集合内では使用不可
特殊記号
\Q次の \E まで、正規表現演算子を抑制します。
\E\Q の効果を終了します。

5.1.4. 量指定子

繰り返し回数の指定

欲張り無欲強欲
(Ver.2 以降)
????+一回または零回
**?*+零回以上
+++++一回以上
{n,m}{n,m}?{n,m}+n回以上m回以下
{n,}{n,}?{n,}+n回以上
{n}{n}?{n}+n

5.1.5. 錨 (アンカー)

^行頭
$行末
\b単語境界
\B非単語境界
\A文字列先頭
\Z文字列末尾、または文字列末尾の改行の直前
\z文字列末尾
\G照合開始位置
(g オプション指定時の置換処理中は、直前の照合終了位置)

5.1.6. 文字集合

文字集合 ([...]) の中で使える演算子類

^...否定 (最低優先度演算子)
x-y範囲 (x から y まで)
[...]集合 (文字集合内文字集合)
..&&..積演算 (^の次に優先度が低い演算子)
[:xxxxx:]
[:^xxxxx:] (否定)
POSIX ブラケット
alnum, alpha, blank, cntrl, digit, graph, lower, print, punct, space, upper, xdigit, word, ascii

5.1.7. 拡張式集合

(?#...)注釈
(?imsxadlu-imsx)
(?^imsxalu-imsx)
孤立オプション (Ver.3 で拡張)
i
大文字小文字照合
m
複数行 (^, $ が文字列中の改行直後・直前にマッチする)
s
単一行 (. が改行にマッチする)
x
拡張形式
a
\d, \s, \w, POSIX ブラケットを ASCII の範囲に限定
aa
(ASCII/非ASCII のマッチを抑制)
d
(デフォルト)
l
(現在のロケール)
u
Unicode
^
d-imsx と同義
i を指定すると、大文字小文字を同一視してマッチを行います。Ver.3 以降では、Unicode だけでなく Shift_JIS でも、全角英字・ギリシャ文字・キリル文字を含めた大文字小文字同一視マッチを行います。
a を指定すると、Unicode API, ANSI API (ASCII/Shift_JIS/UTF-8) に関わらず、\d, \s, \w, POSIX ブラケットのマッチ範囲を ASCII 範囲内に限定します。\p{} については、従来通り ASCII に限定されません。
u を指定すると、\d, \s, \w, POSIX ブラケットのマッチ範囲が従来通りの動作となります。例えば ANSI API で /k オプション (Shift_JIS) を指定した場合、Onigmo のドキュメントに記載の通り、\w は英数字、"_" および 多バイト文字にマッチします。
\b, \B も、この指定の影響を受けます。
現在のバージョンでは aa は、a と同義です。また、l, d は、u と同義です。
(?imsxadlu-imsx:pattern)
(?^imsxalu-imsx:pattern)
式オプション (Ver.3 で拡張)
(pattern)捕獲式集合
(?:pattern)非捕獲式集合
(?=pattern)先読み
(?!pattern)否定先読み
(?<=pattern)戻り読み
(?<!pattern)否定戻り読み
\K保持 (Ver.3 以降)
\K より左側を保持し、それを検索結果 ($&) に含めません。戻り読み (?<=pattern) の別表記と考えることができますが、可変長が使える点が異なります。また、検索対象文字列の途中から検索を開始する場合は、結果が異なる場合があります。(戻り読みの場合は検索開始位置から戻って検索を行うが、\K は戻って検索は行わないため。)
(?>pattern)原子的式集合
(?<name>pattern)
(?'name'pattern)
名前付き捕獲式集合
(?(cond)yes|no)
(?(cond)yes)
条件式 (Ver.3 以降)
(cond) が真であれば yes がマッチし、偽であれば no がマッチします。(cond) には以下のものが使用できます。
(n) (n >= 1)
番号指定の後方参照が何かにマッチしていれば真、マッチしていなければ偽
(<name>), ('name')
名前指定の後方参照が何かにマッチしていれば真、マッチしていなければ偽
現バージョンでは、先読み・戻り読みを条件に指定することはできません。

5.1.8. 後方参照

\n絶対番号指定参照 (n >= 1)
\k<n>
\k'n'
\g{n}
絶対番号指定参照 (n >= 1)
\k<-n>
\k'-n'
\g{-n}
相対番号指定参照 (n >= 1)
\k<name>
\k'name'
\g{name}
名前指定参照
\k<n+level>
\k<n-level>
\k'n+level'
\k'n-level'
ネストレベル付き後方参照 (絶対番号指定) (n >= 1)
\k<-n+level>
\k<-n-level>
\k'-n+level'
\k'-n-level'
ネストレベル付き後方参照 (相対番号指定) (n >= 1)
\k<name+level>
\k<name-level>
\k'name+level'
\k'name-level'
ネストレベル付き後方参照 (名前指定)

Perl 5.10 互換の \g{...} 形式は、Ver.3 以降。

5.1.9. 部分式呼出し

\g<name>
\g'name'
(?&name)
名前指定呼出し
名前が多重定義されていた場合は一番左の式が呼び出されます。
\g<n>
\g'n'
(?n)
絶対番号指定呼出し (n >= 1)
\g<0>
\g'0'
(?0)
(?R)
パターン全体の再帰呼び出し
(Ver.3 以降)
\g<-n>
\g'-n'
(?-n)
後方相対番号指定呼出し (n >= 1)
\g<+n>
\g'+n'
(?+n)
前方相対番号指定呼出し (n >= 1)
(Ver.3 以降)

Perl 5.10 互換の (?...) 形式は、Ver.3 以降。

5.1.10. PCRE/Python サポート

 以上のパターンに加え、以下の PCRE/Python 互換の名前参照も使用可能です。(Ver.3 以降)

(?P<name>pattern) 名前付き捕獲式集合
(?<name>pattern) 相当
(?P=name) 名前指定参照
\k<name> 相当
(?P>name) 名前指定による部分式呼出し
(?&name) 相当

5.1.11. 未対応機能

 以下の正規表現は、現バージョンでは未対応です。

(?|pattern) ブランチリセット
| による分岐ごとに、後方参照の番号をリセットします。
\gn 絶対番号指定による後方参照
\g{n} と同等です。
\g-n 相対番号指定による後方参照
\g{-n} と同等です。
\v, \V 垂直空白、非垂直空白
\h, \H 水平空白、非水平空白
\o{nnn} 文字の(安全な)8進数表現
その他 \N, \N{name}, \N{U+xxxx}, \C, (?p),
(?{code}), (??{code}), (*VERB:ARG)

5.1.12. Unicode 利用時の検索パターン

 pattern1 は Onigmo の Unicode モードで解釈されるため、\w, \W, \s, \S, \d, \D や、POSIX ブラケットなどの動作が変更されます。(例えば \d は各国の数字を含みます。) さらに、\p{}, \P{} では、Onigmo で使えるすべての property-name が使えるようになります。詳細は Onigmo のドキュメントを参照してください。

 Unicode では文字コードが Shift_JIS とは全く異なります。例えば、Shift_JIS ではすべての漢字(第一水準、第二水準)を表す方法として、[亜-熙] などといった表記が使われますが、Unicode ではこの表記は意図した結果にはなりません。代わりに \p{Han} などの Unicode スクリプト名や Unicode プロパティ名を使った表記を使うことになるでしょう。

 \x{HHHH} は、API および文字コードオプションに応じて、Shift_JIS または Unicode のコードポイントを指定します。例えば、「あ」を \x{HHHH} 形式で指定するには、以下のようにします。

 Unicode では、サロゲートペアの使用も可能です。例えば、10 の 24 乗を表す「𥝱(じょ)」の文字は、\x{25771} で指定できます。

 結合文字の扱いについては、以下の制限があります。

5.2. オプション指定

 options は、次のものが指定できます。

k共通文字コードオプション
文字を日本語(Shift_JIS)として扱う (Bregexp.dll 独自拡張)
i検索大文字小文字を区別しない
m検索^, $ が文字列中の改行直後・直前にマッチする
s検索. が改行にマッチする
g置換グローバルな置換
c変換SEARCHLIST を補集合にする
d変換見つかったが置換されなかった文字を削除する
s変換置換された文字が重なったときに圧縮する
x検索拡張正規表現を使用する
a, u,
(d, l)
検索文字セット修飾子 (Ver.3 以降)
詳細は 4.3.1 参照
R検索LF だけでなく、CRLF も改行として扱う (bregonig.dll 独自拡張) (Ver.3 以降)
詳細は 4.3.1 参照

 Bregexp.dll に比べて、BMatch(), BSubst(), BSplit()s, x, a, u, R が使えるように拡張されています。なお、xpattern1 にのみ効果があり、pattern2 には効果はありません。

 Unicode API 利用時は k オプションは無視されます。漢字は常に使用可能です。

5.3. 置換パターン

 pattern2 で使用可能な特殊文字は以下の通りです。

\t水平タブ (0x09)
\n改行 (0x0A)
\r復帰 (0x0D)
\b後退空白 (0x08)
\f改頁 (0x0C)
\a鐘 (0x07)
\e退避修飾 (0x1B)
\nnn8進数表現 (符号化バイト値(の一部))
\xHH16進数表現 (符号化バイト値(の一部))
\x{HHHH}拡張16進数表現 (コードポイント値)
\cx制御文字表現 (コードポイント値)
\l次の1文字を小文字にする。(Ver.3 以降)
\u次の1文字を大文字にする。(Ver.3 以降)
\L\E までを小文字にする。(Ver.3 以降)
\U\E までを大文字にする。(Ver.3 以降)
\E\L, \U を終了させる。(Ver.3 以降)

Bregexp.dll に対して \b, \x{HHHH} が追加されています。また、\nnn の扱いが一部変更されています。(後述)

 Perl では、\x{HHHH} は Unicode でのコードポイントを指定しますが、bregonig.dll では、API と文字コードオプションに応じて、Shift_JIS または Unicode でのコードポイントを指定します。

 以前のバージョンでは、垂直タブを示す \v が使えるようにしてありましたが、Perl 5.10 との混乱を避けるため、この機能は Ver.2 で削除されました。

 Ver.3 以降で、\l, \u, \L, \U, \E が使用できるようになりました。ただし、現バージョンでは Perl とは異なり、大文字小文字変換を行うのは ASCII の範囲内のみとなります。また、検索パターン内では使用できません。

 pattern2 における部分文字列の参照には以下のものが使用できます。

\n
$n
番号指定参照 (n は 1 以上の 10進整数)
(Perl では、$n の方を推奨している。)
${n}(安全な)番号指定参照 (n は 1 以上の 10進整数)
$&マッチした文字列全体
$+最後にマッチした部分文字列 (Ver.1.40 以降)
\k<name>
\k'name'
名前指定参照 (Oniguruma 準拠)
${name}名前指定参照 (bregonig.dll 独自拡張、暫定仕様)
$+{name}名前指定参照 (Perl 5.10 準拠) (Ver.1.40 以降)
同名で重複定義されている場合は、最も左の結果を返す (Ver.2 以降)
$-{name}[n]名前 + 番号指定参照 (Perl 5.10 準拠) (Ver.1.40 以降)

 Bregexp.dll では \n, $n, $& が使えましたが、bregonig.dll では ${n}, $+ と名前指定参照が追加されています。${n} が追加されたことにより、s/(hoge.)/${1}2/g などと、番号指定参照の後に続けて数字を書くことが可能になります。 Bregexp.dll では、これは、s/(hoge.)/$1\x32/g などと書く必要がありました。(\x322 の 16進数表現)

 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 5.10 準拠の形式を推奨。)

 Perl で ${name} と記述した場合には、変数 $name の中身が展開されますが、bregonig.dll では変数が使えないので、代わりに現バージョンでは ${name} を名前指定参照に割り当ててあります。ただし、この仕様は暫定的なものであり、今後変更される可能性もあります。

 Ver.1.40 以降では Perl 5.10 準拠の $+{name}, $-{name}[n] 形式での名前指定参照も使えるようになりました。同じ名前で複数定義されていた場合は、$+{name} を使うと、最も左の結果が取り出されます。(ただし、Ver.1.xx では最も右の結果) $-{name}[n] を使うと、同じ名前の n 番目のマッチ結果が取り出せます。n に 0 を指定すると最も左のマッチ結果が取り出され、-1 を指定すると最も右のマッチ結果が取り出されます。

pattern2 における \nnn の扱いについて

 Perl では、nnn の数字に対応する括弧の組があれば、\10, \11 などで参照できますが、対応する括弧の組がなければ、\10\010 (バックスペース) として扱われ、\11\011 (タブ) のようになります。しかし Bregexp.dll ではこれとは異なり、対応する括弧の組の有無に関わらず、nnn の最初の数字が 0 の場合には常に文字の 8進数表現として扱い、nnn の最初の数字が 1〜9 の場合には常に後方参照となるようになっています。そのため、Bregexp.dll では \077 より大きな文字は \nnn 形式では表現できず、\xHH 形式を使わなければいけません。

 bregonig.dll では、Ver.0.09 までは Bregexp.dll と同じ仕様でしたが、Ver.0.10 以降では Perl の仕様に合わせてあります。ただし、\18 などのように数字の後ろに 8進数で使えない数字が続く場合、Perl では括弧の数に応じて ${1}8 あるいは ${18} として扱われますが、bregonig.dll では常に ${18} として扱われます。(将来的には、これも Perl の仕様に完全に合わせたいと考えています。)

5.4. Bregexp.dll との非互換点

6. 制限事項・注意事項など

6.1. 制限事項・注意事項

6.2. 各メジャーバージョンの位置づけ

 bregonig.dll の各メジャーバージョンの位置づけは以下のようになっています。

Ver.1.xx
Perl 5.8 互換。
ANSI/Shift_JIS 専用。
開発終了。
Ver.2.0x
Perl 5.10 互換(ただし、名前指定参照は Oniguruma 形式)。
Ver.1 の機能に加え、UTF-16LE 対応 API 追加。
今後は、バグ修正のみ継続。
Ver.3.xx
Perl 5.14 互換。
Ver.2 の全機能に加え、UTF-8 対応 API 追加。x64 対応。

6.3. 今後の課題

7. コンパイル方法

 コンパイラは Visual C++ 6.0 以降に対応しています。同梱の Onigmo マルチスレッド対応 & 設定変更パッチ (Onigmo-for-bregonig.diff) を使って、Onigmo にパッチを当ててからコンパイルしてください。なお、Onigmo マルチスレッド対応パッチは OnigPP を参考にしています。

手順例

 .\bregonig\ に bregonig.dll のソースと前述のパッチがあり、.\onigmo-x.y.z\ に Onigmo のソースがあるものとします。(x.y.z の部分はバージョンに合わせて読み替えてください。)

> cd onigmo-x.y.z
> patch -p1 -T < ../bregonig/Onigmo-for-bregonig.diff
> copy win32\*.* .
> nmake onig_s.lib "CFLAGS=/O2 /W3 /MT /DONIG_EXTERN=extern"
> cd ..\bregonig
> nmake ONIG_DIR=../onigmo-x.y.z

Onigmo のコンパイル時に、VS2005 以降を使うときは CFLAGS/D_CRT_SECURE_NO_DEPRECATE を追加しておくと、余計な warning が減ります。また、/nologo を追加しておくのも良いでしょう。

8. 更新履歴

8.1. ANSI/Shift_JIS 専用版 (Ver.0.xx, Ver.1.xx)

8.2. Unicode (UTF-16LE) 対応版 (Ver.2.0x)

8.3. Perl 5.14 対応版(鬼雲利用版) (Ver.2.50 betaX, Ver.3.0x)

9. ライセンス

 bregonig.dll のライセンスは Bregexp.dll 同様に Perl と同じライセンス、すなわち GPL と Artistic License のどちらかを選択できるものとします。Artistic License は同梱の perl_license.txt, perl_license_jp.txt を参照してください。

 また、bregonig.dll は、正規表現ライブラリとして Oniguruma (Onigmo) を使用しており、Oniguruma (Onigmo) は BSD ライセンスとなっています。また、ソースファイルの一部にも BSD ライセンスのものが含まれています。同梱の bsd_license.txt を参照してください。再配布などの際には、BSD ライセンスに従い、bsd_license.txt も同梱してください。(ドキュメントに bsd_license.txt の内容を転記でも可)

10. 謝辞

 すばらしいライブラリを作られた以下の各氏に感謝します。

11. 連絡先


戻る

Copyright (C) 2006-2013 K.Takata