POSIX 基本正規表現構文
概要
POSIX 基本正規表現構文は Unix ユーティリティ sed が使用しており、grep および emacs がその変種を使用している。Boost.Regex で POSIX 基本正規表現を使用するには、コンストラクタにフラグ basic
を渡す(syntax_option_type
を見よ)。例えば、
// e1 は大文字小文字を区別する POSIX 基本正規表現:
boost::regex e1(my_expression, boost::regex::basic);
// e2 は大文字小文字を区別しない POSIX 基本正規表現:
boost::regex e2(my_expression, boost::regex::basic|boost::regex::icase);
POSIX 基本構文
POSIX 基本正規表現では、以下の特別なものを除くあらゆる文字が文字そのものにマッチする。
.[\*^$
ワイルドカード
文字集合外部の .
1 文字は、以下以外のあらゆる文字 1 文字にマッチする。
NULL 文字(マッチアルゴリズムにフラグ
match_not_dot_null
を渡した場合)。改行文字(マッチアルゴリズムにフラグ
match_not_dot_newline
を渡した場合)。
アンカー
^
は、正規表現の先頭、あるいは部分式の先頭で使用した場合に行頭にマッチする。
$
は、正規表現の終端、あるいは部分式の終端で使用した場合に行末にマッチする。
マーク済み部分式
開始が \(
で終了が \)
の節は部分式として機能する。マッチした部分式はすべてマッチアルゴリズムにより個別のフィールドに分けられる。マーク済み部分式は繰り返しと後方参照により参照が可能である。
繰り返し
あらゆるアトム(文字、部分式、文字クラス)は *
演算子による繰り返しが可能である。
例えば a*
は文字 a の 0 回以上の繰り返しにマッチする(アトムの 0 回の繰り返しは空文字列にマッチする)ため、正規表現 a*b
は以下のいずれにもマッチする。
b
ab
aaaaaaaab
アトムの繰り返しは回数境界指定の繰り返しによっても可能である。
a\{n\}
は a
のちょうど n 回の繰り返しにマッチする。
a\{n,\}
は a
の n 回以上の繰り返しにマッチする。
a\{n,m\}
は a
の n 回以上 m 回以下の繰り返しにマッチする。
例えば
^a\{2,3\}$
は、次のいずれにもマッチするが、
aa
aaa
次のいずれにもマッチしない。
a
aaaa
直前の構造が繰り返し不能な場合に繰り返し演算子を使うとエラーになる。例えば次は
a\\(*\\)
*
演算子を適用可能なものがないためエラーとなる。
後方参照
エスケープ文字の直後に数字 n
があると、部分式 n
にマッチしたものと同じ文字列にマッチする。n
は 0 から 9 の範囲である。例えば次の正規表現は、
^\\(a*\\)[^a]*\\1$
次の文字列にマッチする。
aaabbaaa
しかし、次の文字列にはマッチしない。
aaabba
文字集合
文字集合は [
で始まり ]
で終わる括弧式であり、文字の集合を定義する。集合に含まれるいずれかの 1 文字にマッチする。
文字集合に含められる要素は以下の組み合わせである。
単一の文字
例えば [abc]
は a
、b
、c
のいずれか 1 文字にマッチする。
文字範囲
例えば [a-c]
は ‘a’ から ‘c’ までの範囲の 1 文字にマッチする。POSIX 基本正規表現の既定では、文字 x
が y
から z
の範囲であるとは、文字の照合順がその範囲内にある場合をいう。結果はロカールの影響を受ける。この動作は正規表現構築時に collate
オプションフラグを設定しないことで抑止でき、文字が特定の範囲内にあるかどうかは文字のコードポイントのみで決定する。
否定
括弧式が文字 ^
で始まっている場合は、正規表現に含まれる文字の補集合となる。例えば [^a-c]
は範囲 a-c
を除くあらゆる文字にマッチする。
文字クラス
[[:name:]]
のような形式の正規表現は名前付き文字クラス「name」にマッチする。例えば [[:lower:]]
はあらゆる小文字にマッチする。文字クラス名を見よ。
照合要素
[[.col.]]
のような形式の式は照合要素 col
にマッチする。照合要素とは、単一の照合単位として扱われる文字か文字シーケンスである。照合要素は範囲の端点としても使用できる。例えば [[.ae.]-c]
は文字シーケンス “ae” に加えて、現在の範囲 “ae”-c の文字のいずれかにマッチする。 後者において “ae” は現在のロカールにおける単一の照合要素として扱われる。
照合要素は(通常、文字集合内で使用できない)エスケープの代わりとして使用できる。例えば [[.^.]abc]
は ‘abc^’ のいずれかの 1 文字にマッチする。
この拡張として、照合要素をシンボル名で指定する方法もある。例えば、
[[.NUL.]]
は NUL 文字にマッチする。照合要素名を見よ。
等価クラス
[[=col=]]
のような形式の正規表現は、第 1 位のソートキーが照合要素 col
と同じ文字および照合要素にマッチする。照合要素名 col
は照合シンボル名でもよい。第 1 位のソートキーでは大文字小文字の違い、アクセント記号の有無、ロカール固有のテーラリング(tailoring)は無視される。よって [[=a=]]
は a 、À 、Á 、Â 、Ã 、Ä 、Å 、A 、à 、á 、â 、ã 、ä および å のいずれにもマッチする。残念ながらこの機能の実装はプラットフォームの照合と地域化のサポートに依存し、すべてのプラットフォームで移植性の高い動作は期待できず、単一のプラットフォームにおいてもすべてのロカールで動作するとは限らない。
結合
以上の要素はすべて 1 つの文字集合宣言内で結合可能である。例:[[:digit:]a-c[.NUL.]]
エスケープ
上で述べた \{
、\}
、\(
および \)
を例外として、エスケープの直後に文字が現れる場合はその文字にマッチする。これにより特殊文字
.[\*^$
を「通常の」文字にすることができる。エスケープ文字は文字集合内ではその特殊な意味を失うことに注意していただきたい。したがって [^]
は直値の \
か ^
にマッチする。
マッチするもの
正規表現のマッチに複数の、可能な「最良」マッチは最左最長の規則で得られるものである。
バリエーション
grep
grep フラグを設定して正規表現をコンパイルすると、改行区切りの POSIX 基本正規表現のリストとして扱われ、リスト内にマッチする正規表現があればマッチとなる。例えば次のコードは、
boost::regex e("abc\ndef", boost::regex::grep);
POSIX 基本正規表現の abc
か def
のいずれかにマッチする。
名前が示すように、この動作は Unix ユーティリティの grep に合致する。
emacs
POSIX 基本機能に加えて以下の文字が特殊である。
文字 |
説明 |
---|---|
|
直前のアトムの 1 回以上の繰り返し。 |
|
直前のアトムの 0 回か 1 回の繰り返し。 |
|
|
|
|
|
|
また、以下のエスケープシーケンスが考慮される。
エスケープ |
説明 |
---|---|
|
選択を表す。 |
|
マーク付けを行わないグループ構造。余計な部分式を生成することなく、字句的なグループ化が可能である。 |
|
単語構成文字にマッチする。 |
|
非単語構成文字にマッチする。 |
|
構文グループ |
|
構文グループ |
|
これらはサポートしない。 |
|
バッファ(あるいはマッチ対象テキスト)の先頭 0 文字にのみマッチする。 |
|
バッファ(あるいはマッチ対象テキスト)の終端 0 文字にのみマッチする。 |
|
単語境界の先頭 0 文字にのみマッチする。 |
|
非単語境界の先頭 0 文字にのみマッチする。 |
|
単語の先頭 0 文字にのみマッチする。 |
|
単語の終端 0 文字にのみマッチする。</td> |
最後に emacs スタイルの正規表現マッチは、Perl の「深さ優先探索」規則にしたがうことに注意していただきたい。emacs の正規表現は、POSIX スタイルの最左最長規則と調和しない Perl ライクの拡張を含むためこのような動作をする。
オプション
正規表現構築時に basic および grep オプションとともに指定可能なフラグが多数ある。特に collate
、icase
オプションが大文字小文字の区別やロカール依存の動作を変更するのに対し、newline_alt
、no_char_classes
、no_intervals
、bk_plus_qm
、bk_plus_vbar
オプションは構文を変更するという点に注意していただきたい。