std::regex_constants::syntax_option_type
| ヘッダ <regex> で定義 |
||
| using syntax_option_type = /* 実装定義 */; |
(1) | (C++11以降) |
| constexpr syntax_option_type icase = /* 未指定 */; constexpr syntax_option_type nosubs = /* 未指定 */; |
(2) | (C++11以降) (C++17以降インライン化) |
| inline constexpr syntax_option_type multiline = /* 未指定 */; |
(3) | (C++17以降) |
目次 |
[編集] 定数
| 文法オプション | 効果 |
ECMAScript
|
修正ECMAScript正規表現文法を使用する。 |
basic
|
基本POSIX正規表現文法を使用する (文法のドキュメント)。 |
extended
|
拡張POSIX正規表現文法を使用する (文法のドキュメント)。 |
awk
|
POSIXのawkユーティリティで使用される正規表現文法を使用する (文法のドキュメント)。 |
grep
|
POSIXのgrepユーティリティで使用される正規表現文法を使用する。これは事実上、basicオプションに加えて、選択(alternation)の区切り文字として改行 '\n' を追加したものと同じである。 |
egrep
|
POSIXのgrepユーティリティで-Eオプションを付けた場合に使用される正規表現文法を使用する。これは事実上、extendedオプションに加えて、選択(alternation)の区切り文字として '|' に加えて改行 '\n' を追加したものと同じである。 |
| 文法のバリエーション | 効果 |
icase
|
文字のマッチングを大文字小文字を区別せずに行う。 |
nosubs
|
マッチを実行する際、マークされたすべてのサブ式 (expr) は、マークなしのサブ式 (?:expr) として扱われます。指定された std::regex_match 構造体にマッチは格納されず、mark_count() はゼロになります。 |
optimize
|
正規表現エンジンに対し、構築が遅くなる可能性を犠牲にしてマッチングを高速化するよう指示する。例えば、これは非決定性FSAを決定性FSAに変換することを意味する場合がある。 |
collate
|
"[a-b]" 形式の文字範囲はロケールに依存するようになる。 |
multiline (C++17) |
ECMAScriptエンジンが選択されている場合、^が行の先頭にマッチし、$が行の末尾にマッチするように指定する。 |
ECMAScript、basic、extended、awk、grep、egrep の文法オプションからは、最大で1つだけ選択できます。文法が選択されない場合、ECMAScript が選択されたとみなされます。その他のオプションはバリエーションとして機能し、たとえば std::regex("meow", std::regex::icase) は std::regex("meow", std::regex::ECMAScript|std::regex::icase) と同等です。
[編集] 注記
POSIX は「最左最長」マッチングルール(最も長いマッチする部分文字列がマッチし、そのような部分文字列が複数ある場合は最初に現れるものがマッチする)を使用するため、マークアップ言語の解析には適していません。たとえば、POSIX の正規表現 "<tag[^>]*>.*</tag>" は、最初の "<tag" から最後の "</tag>" まで、その間のすべての "</tag>" や "<tag>" を含めてマッチしてしまいます。一方、ECMAScript は非欲張りマッチをサポートしており、ECMAScript の正規表現 "<tag[^>]*>.*?</tag>" は、最初の閉じタグまでしかマッチしません。
[編集] 例
ECMAScript と POSIX 正規表現のマッチングアルゴリズムの違いを示しています。
#include <iostream> #include <regex> #include <string> int main() { std::string str = "zzxayyzz"; std::regex re1(".*(a|xayy)"); // ECMA std::regex re2(".*(a|xayy)", std::regex::extended); // POSIX std::cout << "Searching for .*(a|xayy) in zzxayyzz:\n"; std::smatch m; std::regex_search(str, m, re1); std::cout << " ECMA (depth first search) match: " << m[0] << '\n'; std::regex_search(str, m, re2); std::cout << " POSIX (leftmost longest) match: " << m[0] << '\n'; }
出力
Searching for .*(a|xayy) in zzxayyzz: ECMA (depth first search) match: zzxa POSIX (leftmost longest) match: zzxayy
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 2053 | C++11 | 定数が static で宣言されていた。 | static 指定子を削除した。 |
[編集] 関連項目
| (C++11) |
正規表現オブジェクト (クラステンプレート) |