std::regex_constants::syntax_option_type
ヘッダ <regex> で定義
|
||
typedef /*unspecified*/ syntax_option_type; |
(C++11以上) | |
constexpr syntax_option_type icase = /*unspecified*/; constexpr syntax_option_type nosubs = /*unspecified*/; |
(C++11以上) (C++17未満) |
|
inline constexpr syntax_option_type icase = /*unspecified*/; inline constexpr syntax_option_type nosubs = /*unspecified*/; |
(C++17以上) | |
syntax_option_type
は、正規表現がどのように動作するかに影響を与えるオプションを持つ、 BitmaskType です。
この型に対して使用可能な値は std::basic_regex の内部に複製されています。
目次 |
[編集] 定数
値 | 効果 |
icase
|
大文字小文字を考慮せずに文字のマッチングを行います。 |
nosubs
|
マッチを行うとき、すべてのマーク付き部分表現 (expr) を、マークなしの部分表現 (?:expr) として扱います。 供給された std::regex_match 構造体に格納されるマッチはなく、 mark_count() はゼロになります。
|
optimize
|
構築が遅くなる可能性があっても、マッチングを高速化するよう、正規表現エンジンに指示します。 例えば、これは非決定的 FSA を決定的 FSA に変換することを意味するかもしれません。 |
collate
|
"[a-b]" 形式の文字範囲をロケール対応にします。 |
multiline (C++17)
|
ECMAScript エンジンが選択された場合、 ^ を行頭にマッチさせ、 $ を行末にマッチさせます。
|
ECMAScript
|
修正 ECMAScript 正規表現文法を使用します。 |
basic
|
基本 POSIX 正規表現文法を使用します (文法のドキュメント)。 |
extended
|
拡張 POSIX 正規表現文法を使用します (文法のドキュメント)。 |
awk
|
POSIX の awk ユーティリティで使用される正規表現文法を使用します (文法のドキュメント)。 |
grep
|
POSIX の grep ユーティリティで使用される正規表現文法を使用します。 これは実質的に代替区切り文字として改行 '\n' を追加した basic オプションと同じです。
|
egrep
|
POSIX の grep ユーティリティで -E オプションを付けたときに使用される正規表現文法を使用します。 これは実質的に代替区切り文字として '|' に加えて改行 '\n' を追加した extended オプションと同じです。
|
ECMAScript
、basic
、extended
、awk
、grep
、egrep
のうち高々ひとつの文法オプションだけを選択できます。 文法を選択しない場合は ECMAScript
が選択されたと仮定されます。 他のオプションは修飾子として働きます。 例えば std::regex("meow", std::regex::icase) は std::regex("meow", std::regex::ECMAScript|std::regex::icase) と同等です。
[編集] ノート
POSIX は「最左最長」マッチング規則 (最も長くマッチする部分シーケンスがマッチし、そのような部分シーケンスが複数ある場合は最初のものがマッチする) を使用するため、例えば、マークアップ言語をパースするためには適していません。 "<tag[^>]*>.*</tag>" ��ような POSIX 正規表現は、最初の "<tag" から最後の "</tag>" まで、間にあるすべての "</tag>" および "<tag>" を含んで、マッチするでしょう。 それに対して、 ECMAScript は非貪欲なマッチをサポートします。 ECMAScript の正規表現 "<tag[^>]*>.*?</tag>" は最初の閉じタグまでだけにマッチするでしょう。
C++11 では、これらの定数は冗長なキーワード static
を使用して規定されていました。 これは C++14 で LWG issue 2053 によって削除されました。
[編集] 例
ECMAScript と POSIX の正規表現のマッチングアルゴリズムの違いを示します。
#include <iostream> #include <string> #include <regex> 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++11) |
正規表現オブジェクト (クラステンプレート) |