std::regex_constants:: syntax_option_type
|
定義済みヘッダ
<regex>
|
||
|
using
syntax_option_type
=
/* implementation-defined */
;
|
(1) | (C++11以降) |
|
constexpr
syntax_option_type icase
=
/* unspecified */
;
constexpr
syntax_option_type nosubs
=
/* unspecified */
;
|
(2) |
(C++11以降)
(C++17以降インライン) |
|
inline
constexpr
syntax_option_type multiline
=
/* unspecified */
;
|
(3) | (C++17以降) |
目次 |
定数
| 文法オプション | 効果 |
ECMAScript
|
修正ECMAScript正規表現文法 を使用します。 |
basic
|
基本POSIX正規表現文法を使用します( 文法ドキュメント )。 |
extended
|
拡張POSIX正規表現文法を使用します( 文法ドキュメント )。 |
awk
|
POSIXにおける awk ユーティリティで使用される正規表現文法を使用します( 文法ドキュメント )。 |
grep
|
POSIXにおける
grep
ユーティリティで使用される正規表現文法を使用します。これは実質的に
basic
オプションと同じですが、改行
'
\n
'
が選択肢区切りとして追加されています。
|
egrep
|
POSIXにおける
grep
ユーティリティで
-E
オプションを使用した場合の正規表現文法を使用します。これは実質的に
extended
オプションと同じですが、
'|'
に加えて改行
'
\n
'
も選択肢区切りとして追加されています。
|
| 文法バリエーション | 効果 |
icase
|
大文字小文字を区別せずに文字マッチングを実行します。 |
nosubs
|
マッチング実行時、すべてのマークされた部分式
(
expr
)
は非マーク部分式
(?:
expr
)
として扱われます。提供された
std::regex_match
構造体にはマッチが保存されず、
mark_count()
はゼロになります。
|
optimize
|
正規表現エンジンにマッチングを高速化するよう指示しますが、構築が遅くなる可能性があります。例えば、非決定性有限状態オートマトンを決定性有限状態オートマトンに変換することが含まれます。 |
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)
|
正規表現オブジェクト
(クラステンプレート) |