(?
<=式)
, (
?<!
式)
︾、式オプション ︽(
?im
sx-
ims
x:式)
︾、POSIX ブラケット ︽[:a
sci
i:]
︾、文字プロパティ ︽\p
{As
cii}
︾、名前付き捕獲式集合と名前指定後方参照 ︽(?
<na
me>
式)
, \k
<na
me>
︾ などが新たに使えるようになります。
K2Editor で使われている K2Regexp.dll と、サクラエディタで使われている Bregexp.dll for SAKURA にも対応しています。K2Editor やサクラエディタなどで、この bregonig.dll を使うことで、検索機能や置換機能が大幅に強化されます。
BMa
tch
()
●BSu
bst
()
●BTr
ans
()
●BSp
lit
()
●BRe
gfr
ee()
●BRe
gex
pVe
rsi
on()
また、以下の Bregexp.dll for SAKURA 互換の API も使用できます。
●BMa
tch
Ex()
●BSu
bst
Ex()
U
NIC
ODE
, _U
NIC
ODE
を定義した状態で、同梱の src.7z に入っている bregexp.h をインクルードし、bregonig.lib をリンクすることで Unicode 版 API が使用できるようになります。︵Bregexp.dll に付属の bregexp.h は不可︶
#define UNICODE #define _UNICODE #include "bregexp.h"
Lo
adL
ibr
ary
()
, Ge
tPr
ocA
ddr
ess
()
を使って明示的リンクをする場合は、API 名の末尾に W
を付けた名前を使って、G
etP
roc
Add
res
s()
を呼ぶことで、Unicode 版 API の関数アドレスを取得できます。
hBregOnig = LoadLibrary(_T("bregonig.dll")); pBMatch = GetProcAddress(hBregOnig, "BMatchW"); pBRegfree = GetProcAddress(hBregOnig, "BRegfreeW");
BRE
GEX
P
構造体を使って、Unicode 版 API と ANSI 版 API を混在して呼び出してはいけません。混在して呼び出すと予期しない結果が起こる可能性があります。
●メモリを解放する BRe
gfr
ee()
も、Unicode 版と ANSI 版は別になっていますので注意してください。
●k2regexp.dll では Unicode 版 API は使えません。Ver.1.xx と異なる点は、使える正規表現が拡張されている点のみです。
m
/pa
tte
rn1
/op
tio
ns
や s
/pa
tte
rn1
/pa
tte
rn2
/op
tio
ns
のように単一の文字列で指定していましたが、新 API では、
pat
ter
n1
, pa
tte
rn2
, op
tio
ns
をそれぞれ個別の文字列で指定します。従来 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);
pat
ter
np
検索パターン︵NUL 文字終端︶ (5.1. 参照)
NU
LL
を指定すると、前回のコンパイル済みパターンを使用する。
opt
ion
p
オプション︵NUL 文字終端︶ (下記参照)
pa
tte
rnp
が NUL
L
の場合は無視される。不要時は空文字または N
ULL
を指定する。
str
sta
rtp
検索対象文字列︵N
ULL
不可︶
tar
get
sta
rtp
検索開始位置︵NU
LL
不可︶
tar
get
end
p
検索終了位置︵NU
LL
不可︶
one
_sh
ot
TRU
E
ワンショットモード
検索開始位置で検索パターンがマッチするか調べる。
FAL
SE
通常モード
rxp
BRE
GEX
P
構造体ポインタ (rx
) へのポインタ
初回呼び出し時は BR
EGE
XP
構造体ポインタ (
rx
) を N
ULL
で初期化しておかなければならない。
使用終了後は、B
Reg
fre
e()
で解放すること。
msg
エラーメッセージの格納先︵NUL
L
不可︶
終端の NUL 文字を含めて BR
EGE
XP_
MAX
_ER
ROR
_ME
SSA
GE_
LEN
(= 80) 文字分の領域が必要
rx->
npa
ren
パターンの中の ()
の数 (*1)
rx->
sta
rt[
0]
マッチ範囲の開始位置 (*2)
rx->
end
[0]
マッチ範囲の終了位置 (*2)
rx->
sta
rt[
n]
$n
の開始位置 (1 <= n<= nparen) (*2) (*3)
rx->
end
[n]
$n
の終了位置 (1 <= n<= nparen) (*2) (*3)
(*1)
パターンのコンパイルが成功していれば、マッチの失敗・成功に関わらず有効な値が入る。
(*2)
マッチ成功時のみに有効な値が入る。
(*3)
マッチしなかった部分には NUL
L
が入る。例えば
"(
a)|
(b)
"
というパターンを "
b"
にマッチさせた場合、$1
にはマッチしないため、
rx->
sta
rt[
1]
==
rx->
end
[1]
== NU
LL
となる。
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
の動作が変更される。
#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);
pat
ter
np
検索パターン︵NUL 文字終端︶ (5.1. 参照)
NU
LL
を指定すると、前回のコンパイル済みパターンを使用する。
sub
stp
置換パターン (NUL 文字終端) (5.3. 参照)
NU
LL
を指定すると、前回のコンパイル済みパターンを使用する。
opt
ion
p
オプション︵NUL 文字終端︶ (4.3.1. のオプション項目参照)
pa
tte
rnp
が NUL
L
の場合は無視される。
不要時は空文字または NUL
L
を指定する。
str
sta
rtp
置換対象文字列︵N
ULL
不可︶
tar
get
sta
rtp
置換開始位置︵NU
LL
不可︶
tar
get
end
p
置換終了位置︵NU
LL
不可︶
cal
lba
ck
コールバック関数へのポインタ。(4.3.3. 参照)
不要時は NUL
L
を指定すること。
rxp
BRE
GEX
P
構造体ポインタ (rx
) へのポインタ
初回呼び出し時は BR
EGE
XP
構造体ポインタ (
rx
) を N
ULL
で初期化しておかなければならない。
使用終了後は、B
Reg
fre
e()
で解放すること。
msg
エラーメッセージの格納先︵NUL
L
不可︶
終端の NUL 文字を含めて BR
EGE
XP_
MAX
_ER
ROR
_ME
SSA
GE_
LEN
(= 80) 文字分の領域が必要
rx->
out
p
置換結果の先頭︵置換成功時のみ有効︶
rx->
out
end
p
置換結果の末尾︵置換成功時のみ有効︶
置換結果は NUL 文字終端されているため、置換結果に NUL 文字が含まれていないことが分かっているのであれば、
rx->
out
end
p
を参照する必要はありません。
置換が成功した場合でも、置換結果が空文字となった場合は、out
p
, out
end
p
には NULL が格納されます。
BoM
atc
h()
同様に有効です。
Bo
Mat
ch()
で検索後、同じパターンを用いて B
oSu
bst
()
で置換を行う場合は、
pat
ter
np
, op
tio
np
に
NU
LL
を渡すことで、パターンのコンパイルを省略することができます。その際、
sub
stp
の指定は必須です。逆に、BoS
ubs
t()
で置換後、同じパターンを用いて
Bo
Mat
ch()
で検索することもできます。
Bo
Sub
st()
で置換時、
pat
ter
np
に N
ULL
を指定し s
ubs
tp
に N
ULL
以外を指定することで、前回の
pat
ter
np
のコンパイル結果を流用することができます。しかし逆に
pat
ter
np
に N
ULL
以外を指定し s
ubs
tp
に N
ULL
を指定することはできません。
g
オプションを指定し、1つの文字列に対して複数回置換を行う場合に、コールバック関数を用いて進捗を調べたり、置換を中断することができます。
typedef BOOL (__stdcall *BCallBack)(int kind, int value, ptrdiff_t index);
kin
d
0 固定
val
ue
置換回数
ind
ex
置換位置
TRU
E
処理継続
FAL
SE
処理中断
BMa
tch
()
, BM
atc
hEx
()
, BS
pli
t()
/pa
tte
rn1
/op
tio
ns
m/
pat
ter
n1/
opt
ion
s
BSu
bst
()
, BS
ubs
tEx
()
s/p
att
ern
1/p
att
ern
2/o
pti
ons
BTr
ans
()
tr/
pat
ter
n3/
pat
ter
n4/
opt
ion
s
y/
pat
ter
n3/
pat
ter
n4/
opt
ion
s
(Ver.3 以降)
Bregexp.dll や Perl と同様に、m//
, s/
//
, tr
///
, y/
//
の形式の場合には、パターンの区切り文字には /
以外のものを使うこともできます。︵\x
01
などのコントロール文字も使用可能。︶
なお、Perl とは異なり、s
<pt
n1>
{pt
n2}
opt
のように対応する括弧でくくったり、
pat
ter
n1
と p
att
ern
2
を違う文字でくくることはできません。これは Bregexp.dll と同じ動作です。
pa
tte
rn2
, op
tio
ns
の部分は bregonig.dll が自前で処理を行っており、Onigmo や Bregexp.dll あるいは Perl とは多少仕様が異なっています。︵詳細は後述︶
pa
tte
rn3
, pa
tte
rn4
の部分は、Bregexp.dll のソースをほとんどそのまま使用しているため、使えるパターンも Bregexp.dll とほとんど同じです。︵\b
, \x
{HH
HH}
, \o
{nn
n}
が追加されている点が異なります。︶
以前のバージョンでは、垂直タブを示す \
v
も使えるようにしてありましたが、Perl 5.10 との混乱を避けるため、この機能は Ver.2 で削除されました。また、オリジナルの Bregexp.dll と同様に、t
r/あ
-Z/
x/
などのように文字コードの範囲が 256 以上となるような指定はできません。
pa
tte
rn1
の部分は、Onigmo の正規表現パターン文法として ON
IG_
SYN
TAX
_PE
RL
を指定した場合の正規表現が利用可能となっており、基本的には Perl 5.14 とほぼ同じ文法が使えます。ただし、Onigmo のドキュメント や 5.1.11. にも記載しているように、一部対応していない機能があります。
なお、ONI
G_S
YNT
AX_
PER
L
は﹁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}
形式で指定するには、以下のようにします。
●Shift_JIS: \x{82a0}
●UTF-16LE, UTF-8: \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 参照 |
BMatch()
, BSub
st()
, 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 以降) |
\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 以降) |
\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}
と記述した場合には、変数 $na
me
の中身が展開されますが、bregonig.dll では変数が使えないので、代わりに現バージョンでは ${name}
を名前指定参照に割り当ててあります。ただし、この仕様は暫定的なものであり、今後変更される可能性もあります。
Ver.1.40 以降では Perl 5.10 準拠の $+{
name}
, $-{name}[n]
形式での名前指定参照も使えるようになりました。同じ名前で複数定義されていた場合は、$+{n
ame}
を使うと、最も左の結果が取り出されます。︵ただし、Ver.1.xx では最も右の結果︶ $-{name}[n]
を使うと、同じ名前の n
番目のマッチ結果が取り出せます。n
に 0 を指定すると最も左のマッチ結果が取り出され、-1 を指定すると最も右のマッチ結果が取り出されます。
pattern2
における \nnn
の扱いについて
nnn
の数字に対応する括弧の組があれば、\1
0
, \11
などで参照できますが、対応する括弧の組がなければ、\10
は \010
(バックスペース) として扱われ、\11
は \011
(タブ) のようになります。しかし Bregexp.dll ではこれとは異なり、対応する括弧の組の有無に関わらず、n
nn
の最初の数字が 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
と解釈します。︵ただし、patt
ern3
, pattern4
は、Bregexp.dll と同じ動作です。︶
(|pattern)
への対応。
●(?[])
への対応。(Perl 5.18)
●条件式における、先読み・戻り読みへの対応。
●選択子 |
を使った検索の高速化。(Commentz-Walter 法など?)
参考: How to Implement World Fastest Grep.
●ファイルサイズ (Unicode データサイズ) の縮小。
●置換パターン (pattern2
) 内の \l
, \u
, \L
, \U
による大文字小文字変換の、ASCII 範囲外の文字への対応。
●\v
, \V
, \h
, \H
への対応。
bregonig
ブランチのものを使用します。
> 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
[亜-煕]
ではなく [
亜-熙]
が正しい。
●2012/03/30 Ver.3.02
●Onigmo (Oniguruma-mod) 5.13.2 を使用。
https://github.com/k-takata/Onigmo/tree/Onigmo-5.13.2
●Unicode 6.1 に対応。(5.13.1)
●戻り読みの中で \b, \B の使用を許可。(5.13.1)
●ネストレベル付き後方参照で相対番号指定参照を許可。︵仕様として明記︶
●[a&&b] のような1文字も含まない文字クラスが予期しないマッチをすることがあったバグを修正。
●条件式の条件として後方参照以外を指定したときにエラーとならず、不正な動作をしていたのを修正。
●1文字しか含まない文字クラスでメモリリークしていたのを修正。
●2012/11/03 Ver.3.03
●Onigmo (Oniguruma-mod) 5.13.3 を使用。
https://github.com/k-takata/Onigmo/tree/Onigmo-5.13.3
●[0-9-a] が [0-9\-a] として扱われていなかったのを修正。
●ビルド高速化。
●JaneXeno で置換の際に大文字・小文字がおかしくなるバグを修正。
●ビルドディレクトリの構成を変更、ビルド高速化。
●2013/03/17 Ver.3.04
●Onigmo (Oniguruma-mod) 5.13.4 を使用。
https://github.com/k-takata/Onigmo/tree/Onigmo-5.13.4
●(?a) と文字クラスを組み合わせると正しくマッチしなかったのを修正。
http://bugs.ruby-lang.org/issues/7972
●(?i:...) が正しく動かない場合があったのを修正。
http://bugs.ruby-lang.org/issues/7974
●\Z がマッチすべきでないところにマッチするのを修正。
http://bugs.ruby-lang.org/issues/8001
●/(?<=fo).*/s が正しくマッチしなかったのを修正。
http://bugs.ruby-lang.org/issues/8023
●2013/07/07 Ver.3.05
●Onigmo (Oniguruma-mod) 5.13.5 を使用。
https://github.com/k-takata/Onigmo/tree/Onigmo-5.13.5
●\z の最適化に関する問題を修正。
http://bugs.ruby-lang.org/issues/8210
●戻り読みの中で、式オプションをサポート。
https://github.com/k-takata/Onigmo/pull/17
●条件式で名前付きキャプチャを使ったときの問題を修正。
https://github.com/k-takata/Onigmo/pull/20
●2014/09/13 Ver.3.06
●Onigmo (Oniguruma-mod) 5.15.0 for bregonig.dll を使用。
https://github.com/k-takata/Onigmo/tree/Onigmo-5.15.0_for_bregonig
●Unicode 7.0 に対応
●Oniguruma 5.9.5 をマージ
●大量のグループを使うと落ちる問題を修正
https://github.com/k-takata/Onigmo/issues/24
●/\x{1ffc}/i =~ "\x1ff3" がマッチしない問題を修正
●UTF-16/32 で /[a-c#]+\W/ =~ "def#" がマッチしない問題を修正
●/(?i)\u0149\u0149/ =~ "\u0149\u0149" がマッチしない問題を修正
https://github.com/k-takata/Onigmo/issues/40
●文字クラスの中で \w を使い、/i オプションを指定したときの問題を修正
https://github.com/k-takata/Onigmo/issues/4
●文字プロパティが /i オプションを無視する問題を修正
https://github.com/k-takata/Onigmo/issues/41
●"ab" =~ /(?!^a).*b/ がマッチしない問題を修正
https://github.com/k-takata/Onigmo/issues/44
●﹁コンパイル方法﹂を更新。
●2016/12/10 Ver.4.00
●Onigmo (Oniguruma-mod) 6.0.0 for bregonig.dll を使用。
https://github.com/k-takata/Onigmo/tree/Onigmo-6.0.0_for_bregonig
●GCC または Clang でコンパイルした場合に、Token Threaded VM に対応
https://github.com/k-takata/Onigmo/pull/52
●Unicode 9.0 に対応
●Perl 文法の際の名前参照の挙動を Perl と同じとなるように変更
https://github.com/k-takata/Onigmo/issues/74
●Unicode エンコーディングにおける [[:punct:]] の挙動の変更
https://github.com/k-takata/Onigmo/issues/42
●大量のグループを使うと落ちる問題を修正
●\X の改善
●\o{OOO} の対応
●非常に深くネストしたキャプチャグループでスタックオーバーフローが起きる問題を修正
https://github.com/k-takata/Onigmo/issues/68
●いくつかのパターンでクラッシュする問題を修正
https://github.com/k-takata/Onigmo/issues/65 等
●戻り読みで Unicode の case-folding に対応していない場合がある問題を修正
https://github.com/k-takata/Onigmo/issues/18
●再帰的なマッチでキャプチャ位置が不正となる問題を修正
https://github.com/k-takata/Onigmo/issues/48
●MSVC でマルチプロセスビルドに対応
●その他、多数の修正を Ruby と Oniguruma からマージ
●﹁コンパイル方法﹂を更新。
●2017/01/17 Ver.4.10
●Onigmo (Oniguruma-mod) 6.1.0 for bregonig.dll を使用。
https://github.com/k-takata/Onigmo/tree/Onigmo-6.1.0_for_bregonig
●非包含オペレータに対応
https://github.com/k-takata/Onigmo/issues/82
●set_bm_skip() における不正メモリアクセスを修正
https://github.com/k-takata/Onigmo/issues/81
●逆方向サーチで .* を使ったときの修正
https://github.com/k-takata/Onigmo/issues/69
●実験的に、非包含オペレータに対応。
●2017/01/29 Ver.4.11
●Onigmo (Oniguruma-mod) 6.1.1 for bregonig.dll を使用。
https://github.com/k-takata/Onigmo/tree/Onigmo-6.1.1_for_bregonig
●UTF-16LE で (?~\S+) が無限ループになるのを修正
●2017/05/15 Ver.4.12
●Onigmo (Oniguruma-mod) 6.1.2 for bregonig.dll を使用。
https://github.com/k-takata/Onigmo/tree/Onigmo-6.1.2_for_bregonig
●戻り値の初期化処理の修正 (Ruby r57660)
https://bugs.ruby-lang.org/issues/13234
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-6181
●非包含オペレータのドキュメント改善
https://github.com/k-takata/Onigmo/issues/87
●2019/01/30 Ver.4.20
●Onigmo (Oniguruma-mod) 6.2.0 for bregonig.dll を使用。
https://github.com/k-takata/Onigmo/tree/Onigmo-6.2.0_for_bregonig
●Unicode データの更新 (Unicode 11.0.0, Emoji 11.0)
●その他バグ修正
●本ドキュメントの各節へのリンク先を変更。
利便性がよくなかったため、ID末尾の `.` を削除。