bregonig.dll Ver.4.20 Copyright (C) 2006-2019 K.Takata
2019/01/30 更新
旧バージョンは、BitBucket 上で公開しています。
ソースコードは、GitHub 上で公開しています。
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 を使うことで、検索機能や置換機能が大幅に強化されます。
32bit アプリには、アーカイブを解凍した直下のディレクトリにあるファイルを、64bit アプリには、x64 ディレクトリにあるファイルをお使いください。
サクラエディタ 1.6.0 以降など、bregonig.dll に標準で対応しているアプリケーションの場合は、bregonig.dll をそのままアプリケーションと同じ場所に置いてください。(ただし、アプリケーションによってはインストール方法が異なる場合もありますので、詳細はそれぞれのマニュアルでご確認ください。)
使用している OS に関わらず、アプリケーションが 32bit 版の場合は 32bit 版の bregonig.dll を、アプリケーションが 64bit 版の場合は 64bit 版の bregonig.dll をお使いください。64bit 版の bregonig.dll は、アーカイブファイルを解凍した先の x64 フォルダの中に入っています。
Bregexp.dll に対応しているが、bregonig.dll には標準で対応していないアプリケーションの場合、bregonig.dll の名前を bregexp.dll に変更し、それをアプリケーションと同じフォルダに置いてください。(ただし、アプリケーションによってはインストール方法が異なる場合もありますので、詳細はそれぞれのマニュアルでご確認ください。)
K2Editor の場合は、同梱の k2regexp.dll を K2Editor.exe のあるフォルダにコピーしてください。(K2Regexp.dll は Bregexp.dll を元に作られているものの、オリジナルの Bregexp.dll とは互換性が無いため、別ファイルになっています。)
(いずれの場合も、元々のファイルはバックアップしておき、何か問題があればすぐに戻せるようにしておくことをお薦めします。)
以下の Bregexp.dll 互換の API が使用できます。
BMatch()
BSubst()
BTrans()
BSplit()
BRegfree()
BRegexpVersion()
また、以下の Bregexp.dll for SAKURA 互換の API も使用できます。
BMatchEx()
BSubstEx()
bregonig.dll Ver.2 以降では、4.1. の各 API について、Unicode (UTF-16LE) 版 API が用意されています。以下のいずれかの方法で使用できます。
以下のように、UNICODE
, _UNICODE
を定義した状態で、同梱の src.7z に入っている bregexp.h をインクルードし、bregonig.lib をリンクすることで Unicode 版 API が使用できるようになります。(Bregexp.dll に付属の bregexp.h は不可)
#define UNICODE #define _UNICODE #include "bregexp.h"
LoadLibrary()
, GetProcAddress()
を使って明示的リンクをする場合は、API 名の末尾に W
を付けた名前を使って、GetProcAddress()
を呼ぶことで、Unicode 版 API の関数アドレスを取得できます。
hBregOnig = LoadLibrary(_T("bregonig.dll")); pBMatch = GetProcAddress(hBregOnig, "BMatchW"); pBRegfree = GetProcAddress(hBregOnig, "BRegfreeW");
BREGEXP
構造体を使って、Unicode 版 API と ANSI 版 API を混在して呼び出してはいけません。混在して呼び出すと予期しない結果が起こる可能性があります。BRegfree()
も、Unicode 版と ANSI 版は別になっていますので注意してください。Ver.3 から、新たに 2つの API を公開しており、それぞれ Unicode 版と ANSI 版が用意されています。
従来の API では、検索・置換パターンを m/pattern1/options
や s/pattern1/pattern2/options
のように単一の文字列で指定していましたが、新 API では、pattern1
, pattern2
, options
をそれぞれ個別の文字列で指定します。従来 API とは異なり、パターンを "/"
で囲ってはいけません。その代わり、パターンに "/"
が含まれる場合でもエスケープする必要はありません。
従来の API とは異なり、各 API の検索対象文字列について、空文字列を受け付けるようになっています。
#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
NULL
を指定すると、前回のコンパイル済みパターンを使用する。optionp
patternp
が NULL
の場合は無視される。不要時は空文字または NULL
を指定する。strstartp
NULL
不可)targetstartp
NULL
不可)targetendp
NULL
不可)one_shot
TRUE
FALSE
rxp
BREGEXP
構造体ポインタ (rx
) へのポインタBREGEXP
構造体ポインタ (rx
) を NULL
で初期化しておかなければならない。BRegfree()
で解放すること。msg
NULL
不可)BREGEXP_MAX_ERROR_MESSAGE_LEN
(= 80) 文字分の領域が必要rx->nparen
()
の数 (*1)rx->start[0]
rx->end[0]
rx->start[n]
$n
の開始位置 (1 <= n <= nparen) (*2) (*3)rx->end[n]
$n
の終了位置 (1 <= n <= nparen) (*2) (*3)NULL
が入る。例えば
"(a)|(b)"
というパターンを "b"
にマッチさせた場合、$1
にはマッチしないため、rx->start[1]
== rx->end[1]
== NULL
となる。i
m
^
, $
が文字列中の改行直後・直前にマッチするs
.
が改行にマッチするg
x
k
8
a
\d
, \s
, \w
, POSIX ブラケットのマッチ範囲を ASCII 内に制限するu
\d
, \s
, \w
, POSIX ブラケットのマッチ範囲は Unicode に準拠する8
オプション指定時 (UTF-8)):\d
, \s
, \w
, POSIX ブラケットのマッチ範囲は Unicode に準拠するk
オプション指定時 (Shift_JIS)):\w
と POSIX ブラケットの一部は、多バイト文字にマッチする8
, k
オプション無指定時 (ASCII)):\d
, \s
, \w
, POSIX ブラケットのマッチ範囲は ASCII 内に制限されるd
u
と同義)l
u
と同義)R
.
, ^
, $
, \Z
の動作が変更される。#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
NULL
を指定すると、前回のコンパイル済みパターンを使用する。substp
NULL
を指定すると、前回のコンパイル済みパターンを使用する。optionp
patternp
が NULL
の場合は無視される。
不要時は空文字または NULL
を指定する。strstartp
NULL
不可)targetstartp
NULL
不可)targetendp
NULL
不可)callback
NULL
を指定すること。rxp
BREGEXP
構造体ポインタ (rx
) へのポインタBREGEXP
構造体ポインタ (rx
) を NULL
で初期化しておかなければならない。BRegfree()
で解放すること。msg
NULL
不可)BREGEXP_MAX_ERROR_MESSAGE_LEN
(= 80) 文字分の領域が必要rx->outp
rx->outendp
置換結果は NUL 文字終端されているため、置換結果に NUL 文字が含まれていないことが分かっているのであれば、rx->outendp
を参照する必要はありません。
置換が成功した場合でも、置換結果が空文字となった場合は、outp
, outendp
には NULL が格納されます。
検索結果も、BoMatch()
同様に有効です。
BoMatch()
で検索後、同じパターンを用いて BoSubst()
で置換を行う場合は、patternp
, optionp
に
NULL
を渡すことで、パターンのコンパイルを省略することができます。その際、substp
の指定は必須です。逆に、BoSubst()
で置換後、同じパターンを用いて
BoMatch()
で検索することもできます。
BoSubst()
で置換時、patternp
に NULL
を指定し substp
に NULL
以外を指定することで、前回の
patternp
のコンパイル結果を流用することができます。しかし逆に patternp
に NULL
以外を指定し substp
に NULL
を指定することはできません。
g
オプションを指定し、1つの文字列に対して複数回置換を行う場合に、コールバック関数を用いて進捗を調べたり、置換を中断することができます。
typedef BOOL (__stdcall *BCallBack)(int kind, int value, ptrdiff_t index);
kind
value
index
TRUE
FALSE
オリジナルの 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
のように対応する括弧でくくったり、pattern1
と pattern2
を違う文字でくくることはできません。これは Bregexp.dll と同じ動作です。
pattern2
, options
の部分は bregonig.dll が自前で処理を行っており、Onigmo や Bregexp.dll あるいは Perl とは多少仕様が異なっています。(詳細は後述)
pattern3
, pattern4
の部分は、Bregexp.dll のソースをほとんどそのまま使用しているため、使えるパターンも Bregexp.dll とほとんど同じです。(\b
, \x{HHHH}
, \o{nnn}
が追加されている点が異なります。)
以前のバージョンでは、垂直タブを示す \v
も使えるようにしてありましたが、Perl 5.10 との混乱を避けるため、この機能は Ver.2 で削除されました。また、オリジナルの Bregexp.dll と同様に、tr/あ-Z/x/
などのように文字コードの範囲が 256 以上となるような指定はできません。
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 で削除されました。
\ |
退避修飾 (エスケープ) 正規表現記号の有効/無効の制御 |
| |
選択子 |
(...) |
式集合 (グループ) |
[...] |
文字集合 (文字クラス) |
\t | 水平タブ (0x09) |
\n | 改行 (0x0A) |
\r | 復帰 (0x0D) |
\b | 後退空白 (0x08) 文字集合の中でのみ有効。 |
\f | 改頁 (0x0C) |
\a | 鐘 (0x07) |
\e | 退避修飾 (0x1B) |
\nnn | 8進数表現 (符号化バイト値(の一部)) 1〜3桁 |
\xHH | 16進数表現 (符号化バイト値(の一部)) 1〜2桁 |
\x{HHHH} | 拡張16進数表現 (コードポイント値) 1〜4桁、あるいは 1〜6桁 |
\o{nnn} | 拡張8進数表現 (コードポイント値) 1〜6桁、あるいは 1〜7桁 (Ver.4 以降) |
\cx | 制御文字表現 (コードポイント値) |
. | 任意文字 (改行を除く) |
\w | 単語構成文字 |
\W | 非単語構成文字 |
\s | 空白文字 |
\S | 非空白文字 |
\d | 10進数字 |
\D | 非10進数字 |
\p{property-name} \p{^property-name} (否定)\P{property-name} (否定) | 文字プロパティ (Ver.3 で強化)
property-name が 1文字の場合でも、{ } を省略することはできません。
|
\R | 改行文字 (Linebreak) (Ver.3 以降) 改行1つにマッチします。CRLF も1文字としてマッチします。
|
\X | 拡張書記素クラスタ (eXtended grapheme cluster) (Ver.3 以降、Ver.4 で強化) Unicode の結合文字等を考慮した1文字にマッチします。
|
\Q | 次の \E まで、正規表現演算子を抑制します。 |
\E | \Q の効果を終了します。 |
繰り返し回数の指定
欲張り | 無欲 | 強欲 (Ver.2 以降) | |
---|---|---|---|
? | ?? | ?+ | 一回または零回 |
* | *? | *+ | 零回以上 |
+ | ++ | ++ | 一回以上 |
{n,m} | {n,m}? | {n,m}+ | n回以上m回以下 |
{n,} | {n,}? | {n,}+ | n回以上 |
{n} | {n}? | {n}+ | n回 |
^ | 行頭 |
$ | 行末 |
\b | 単語境界 |
\B | 非単語境界 |
\A | 文字列先頭 |
\Z | 文字列末尾、または文字列末尾の改行の直前 |
\z | 文字列末尾 |
\G | 照合開始位置 ( g オプション指定時の置換処理中は、直前の照合終了位置) |
文字集合 ([...]
) の中で使える演算子類
^... | 否定 (最低優先度演算子) |
x-y | 範囲 (x から y まで) |
[...] | 集合 (文字集合内文字集合) |
..&&.. | 積演算 (^ の次に優先度が低い演算子) |
[:xxxxx:] [:^xxxxx:] (否定) | POSIX ブラケット alnum, alpha, blank, cntrl, digit, graph, lower, print, punct, space, upper, xdigit, word, ascii |
(?#...) | 注釈 |
(?imsxadlu-imsx) (?^imsxalu-imsx) | 孤立オプション (Ver.3 で拡張)
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) には以下のものが使用できます。
|
(?~pattern) | 非包含オペレータ (Ver.4.10 以降) (実験的、将来的に変更の可能性あり) |
\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 以降。
\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 以降。
以上のパターンに加え、以下の PCRE/Python 互換の名前参照も使用可能です。(Ver.3 以降)
(?P<name>pattern) |
名前付き捕獲式集合(?<name>pattern) 相当 |
(?P=name) |
名前指定参照\k<name> 相当 |
(?P>name) |
名前指定による部分式呼出し(?&name) 相当 |
以下の正規表現は、現バージョンでは未対応です。
(?|pattern) |
ブランチリセット| による分岐ごとに、後方参照の番号をリセットします。 |
(?[]) |
拡張文字集合 演算可能な文字集合。(現状の bregonig の文字集合でも類似の機能は使用可能。) |
\gn |
絶対番号指定による後方参照\g{n} と同等です。 |
\g-n |
相対番号指定による後方参照\g{-n} と同等です。 |
\v , \V |
垂直空白、非垂直空白 |
\h , \H |
水平空白、非水平空白 |
その他 | \N , \N{name} ,
\N{U+xxxx} , \C , (?p) ,(?{code}) , (??{code}) ,
(*VERB:ARG) |
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}
形式で指定するには、以下のようにします。
\x{82a0}
\x{3042}
Unicode では、サロゲートペアの使用も可能です。例えば、10 の 24 乗を表す「𥝱」の文字は、\x{25771}
で指定できます。
結合文字の扱いについては、以下の制限があります。
U+3071
)」と「は(U+306F
)+合成用半濁点(U+309A
)」BSplit()
の検索パターンに空文字列 (//
, m//
) を渡した場合は1文字ごとに分解する仕様となっていますが、結合文字は考慮していないため、ばらばらに分解されてしまいます。
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
が使えるように拡張されています。なお、x
は pattern1
にのみ効果があり、pattern2
には効果はありません。
Unicode API 利用時は k
オプションは無視されます。漢字は常に使用可能です。
pattern2
で使用可能な特殊文字は以下の通りです。
\t | 水平タブ (0x09) |
\n | 改行 (0x0A) |
\r | 復帰 (0x0D) |
\b | 後退空白 (0x08) |
\f | 改頁 (0x0C) |
\a | 鐘 (0x07) |
\e | 退避修飾 (0x1B) |
\nnn | 8進数表現 (符号化バイト値(の一部)) |
\xHH | 16進数表現 (符号化バイト値(の一部)) |
\o{nnn} | 拡張8進数表現 (コードポイント値) (Ver.4 以降) |
\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
などと書く必要がありました。(\x32
は 2
の 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 の仕様に完全に合わせたいと考えています。)
k
(日本語モード) を指定すると、\w
は [A-Za-z0-9_]
だけでなく、2バイト文字(漢字等)にもマッチするようになります。一方、Bregexp.dll では、オプション k
の有無に関わらず、\w
は [A-Za-z0-9_]
と同義です。なお、Perl 5.8 でも、検索対象が Unicode 文字列(utf8 フラグがオン)ならば、\w
は多バイト文字にもマッチします。Bregexp.dll と同じ動作にするには、オプション a
を指定してください。[ ]
の中 に [
を書くときは必ず \[
のようにエスケープしなければならなくなりました。(Ver.1.30 以降)pattern1
, pattern2
における \c\x
の扱いが、Bregexp.dll や Perl と異なります。Bregexp.dll などでは、\c\
が '\x1c'
を表すものの、後ろの \
が次の x
に対するエスケープとして作用します。従って、\c\
をパターンの末尾に置くことはできません。一方、bregonig.dll は Oniguruma の仕様を踏襲し、\c\x
を \cx
と解釈します。(ただし、pattern3
, pattern4
は、Bregexp.dll と同じ動作です。)bregonig.dll の各メジャーバージョンの位置づけは以下のようになっています。
(|pattern)
への対応。(?[])
への対応。(Perl 5.18)|
を使った検索の高速化。(Commentz-Walter 法など?)pattern2
) 内の \l
, \u
, \L
, \U
による大文字小文字変換の、ASCII 範囲外の文字への対応。\v
, \V
, \h
, \H
への対応。
コンパイラは Visual C++ 2005 以降に対応しています。Onigmo のソースコードは、Onigmo のリポジトリの bregonig
ブランチのものを使用します。
Git がインストールされているものとします。
> git clone https://github.com/k-takata/Onigmo.git > cd Onigmo > git checkout bregonig > build_nmake.cmd > cd .. > git clone https://github.com/k-takata/bregonig.git > cd bregonig\src > nmake ONIG_DIR=../../Onigmo
[亜-煕]
ではなく [亜-熙]
が正しい。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 の内容を転記でも可)
すばらしいライブラリを作られた以下の各氏に感謝します。