POSIX 拡張正規表現構文
概要
POSIX 拡張正規表現構文は POSIX C 正規表現 API によりサポートされ、egrep および awk ユーティリティがその変種を使用している。Boost.Regex で POSIX 拡張正規表現を使用するには、コンストラクタにフラグ extended
を渡す。例えば、
// e1 は大文字小文字を区別する POSIX 拡張正規表現:
boost::regex e1(my_expression, boost::regex::extended);
// e2 は大文字小文字を区別しない POSIX 拡張正規表現:
boost::regex e2(my_expression, boost::regex::extended|boost::regex::icase);
POSIX 拡張構文
POSIX 拡張正規表現では、以下の特別なものを除くあらゆる文字が文字そのものにマッチする。
.[{()\*+?|^$
ワイルドカード
文字集合外部の .
1 文字は、以下以外のあらゆる文字 1 文字にマッチする。
NULL 文字(マッチアルゴリズムにフラグ
match_not_dot_null
を渡した場合)。改行文字(マッチアルゴリズムにフラグ
match_not_dot_newline
を渡した場合)。
アンカー
^
は、正規表現の先頭、あるいは部分式の先頭で使用した場合に行頭にマッチする。
$
は、正規表現の終端、あるいは部分式の終端で使用した場合に行末にマッチする。
マーク済み部分式
開始が (
で終了が )
の節は部分式として機能する。マッチした部分式はすべてマッチアルゴリズムにより個別のフィールドに分けられる。マーク済み部分式は繰り返しと後方参照により参照が可能である。
繰り返し
あらゆるアトム(文字、部分式、文字クラス)は *
、+
、?
および {}
演算子による繰り返しが可能である。
*
演算子は直前のアトムの 0 回以上の繰り返しにマッチする。例えば正規表現 a*b
は以下のいずれにもマッチする。
b
ab
aaaaaaaab
+
演算子は直前のアトムの 1 回以上の繰り返しにマッチする。例えば正規表現 a+b
は以下のいずれにもマッチする。
ab
aaaaaaaab
しかし次にはマッチしない。
b
?
演算子は直前のアトムの 0 回あるいは 1 回の出現にマッチする。例えば正規表現 ca?b
は以下のいずれにもマッチする。
cb
cab
しかし次にはマッチしない。
caab
アトムの繰り返しは回数境界指定の繰り返しによっても可能である。
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
注意
POSIX 標準は「拡張」正規表現の後方参照をサポートしない。これは標準に対する互換拡張である。
選択
|
演算子は引数のいずれかにマッチする。よって、例えば abc|def
は abc
か def
のいずれかにマッチする。
括弧を使用すると選択をグループ化できる。例えば ab(d|ef)
は abd
か abef
のいずれかにマッチする。
文字集合
文字集合は [
で始まり ]
で終わる括弧式であり、文字の集合を定義する。集合に含まれるいずれかの 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.]]
エスケープ
POSIX 標準は、POSIX 拡張正規表現についてエスケープシーケンスを定義していない。ただし、以下の例外がある。
特殊文字の前にエスケープが付いている場合は、文字そのものにマッチする。
通常の文字の前にエスケープを付けた場合の効果は未定義である。
文字クラス宣言内のエスケープは、エスケープ文字自身にマッチする。言い換えると、エスケープ文字は文字クラス宣言内では特殊文字ではない。よって
[\^]
は直値の`\
か^
にマッチする。
しかしながら、これではいささか制限が強すぎるため、Boost.Regex は以下の標準互換の拡張をサポートする。
特定の文字にマッチするエスケープ
以下のエスケープシーケンスは、すべて 1 文字の別名である。
エスケープ |
文字 |
---|---|
|
‘\a’ |
|
0x1B |
|
\f |
|
\n |
|
\r |
|
\t |
|
\v |
|
\b |
|
ASCII エスケープシーケンス。コードポイントが X % 32 の文字 |
|
16 進エスケープシーケンス。コードポイントが 0xdd の文字にマッチする。 |
|
16 進エスケープシーケンス。コードポイントが 0xdddd の文字にマッチする。 |
|
8 進エスケープシーケンス。コードポイントが 0ddd の文字にマッチする。 |
|
シンボル名 |
「単一文字」文字クラス
x
が文字クラス名である場合、エスケープ文字 x
はその文字クラスに属するあらゆる文字にマッチし、エスケープ文字 X
はその文字クラスに属さないあらゆる文字にマッチする。
既定でサポートされているものは以下のとおりである。
エスケープシーケンス |
等価な文字クラス |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
文字プロパティ
次の表の文字プロパティ名はすべて文字クラスで使用する名前と等価である。
形式 |
説明 |
等価な文字集合の形式 |
---|---|---|
|
プロパティ |
|
|
プロパティ |
|
|
プロパティ |
|
|
プロパティ |
|
例えば \pd
は \p{digit}
と同様、あらゆる「数字」(digit)にマッチする。
単語境界
次のエスケープシーケンスは単語の境界にマッチする。
エスケープ |
意味 |
---|---|
|
単語の先頭にマッチする。 |
|
単語の終端にマッチする。 |
|
単語境界(単語の先頭か終端)にマッチする。 |
|
単語境界以外にマッチする。 |
バッファ境界
以下はバッファ境界にのみマッチする。この場合の「バッファ」とは、マッチ対象の入力テキスト全体である(^
および $
はテキスト中の改行にもマッチすることに注意していただきたい)。
エスケープ |
意味 |
---|---|
|
バッファの先頭にのみマッチする。 |
|
バッファの終端にのみマッチする。 |
|
バッファの先頭にのみマッチする( |
|
バッファの終端にのみマッチする( |
|
バッファ終端の長さ 0 以上の改行シーケンスにマッチする。正規表現 |
継続エスケープ(Continuation Escape)
シーケンス \G
は最後にマッチが見つかった位置、あるいは前回のマッチが存在しない場合はマッチ対象テキストの先頭にのみマッチする。各マッチが 1 つ前のマッチの終端から始まっているようなマッチをテキスト中から列挙する場合に、このシーケンスは有効である。
クォーティングエスケープ(Quoting Escape)
エスケープシーケンス \Q
は「クォートされたシーケンス」の開始を表す。以降、正規表現の終端か \E
までの文字はすべて直値として扱われる。例えば、正規表現 \Q\*+\Ea+
は以下のいずれかにマッチする。
\*+a
\*+aaa
Unicode エスケープ
エスケープ |
意味 |
---|---|
|
単一のコードポイントにマッチする。Boost.Regex では |
|
結合文字シーケンス(非結合文字に 0 以上の結合文字シーケンスが続く)にマッチする。 |
その他のエスケープ
その他のエスケープシーケンスは、エスケープ対象の文字そのものにマッチする。例えば \@
は直値 @
にマッチする。
演算子の優先順位
演算子の優先順位は以下のとおりである。
# 照合関係の括弧記号 [==]
[::]
[..]
# エスケープ \
# 文字集合(括弧式) []
# グループ ()
# 単一文字の繰り返し *
+
?
{m,n}
# 結合
# アンカー ^$
# 選択 |
マッチするもの
正規表現のマッチに複数の、可能な「最良」マッチは最左最長の規則で得られるものである。
バリエーション
egrep
egrep フラグを設定して正規表現をコンパイルすると、改行区切りの POSIX 拡張正規表現のリストとして扱われ、リスト内にマッチする正規表現があればマッチとなる。例えば次のコードは、
boost::regex e("abc\ndef", boost::regex::egrep);
POSIX 基本正規表現の abc
か def
のいずれかにマッチする。
名前が示すように、この動作は Unix ユーティリティの egrep および grep に -E
オプションを付けて使用したものに合致する。
awk
POSIX 拡張機能に加えて、エスケープ文字が文字クラス宣言内で特殊となる。
さらに、POSIX 拡張仕様が定義しないいくつかのエスケープシーケンスをサポートすることが要求される。Boost.Regex はこれらのエスケープシーケンスを既定でサポートする。
オプション
正規表現構築時に extended および egrep
オプションとともに指定可能なフラグが多数ある。特に collate
、no_subs
、icase
オプションが大文字小文字の区別やロカール依存の動作を変更するのに対し、newline_alt オプションは構文を変更するという点に注意していただきたい。