名前空間
変種
操作

std::regex_constants::syntax_option_type

提供: cppreference.com
< cpp‎ | regex
ヘッダ <regex> で定義
typedef /*unspecified*/ syntax_option_type;
(C++11以上)
constexpr syntax_option_type icase = /*unspecified*/;

constexpr syntax_option_type nosubs = /*unspecified*/;
constexpr syntax_option_type optimize = /*unspecified*/;
constexpr syntax_option_type collate = /*unspecified*/;
constexpr syntax_option_type ECMAScript = /*unspecified*/;
constexpr syntax_option_type basic = /*unspecified*/;
constexpr syntax_option_type extended = /*unspecified*/;
constexpr syntax_option_type awk = /*unspecified*/;
constexpr syntax_option_type grep = /*unspecified*/;

constexpr syntax_option_type egrep = /*unspecified*/;
(C++11以上)
(C++17未満)
inline constexpr syntax_option_type icase = /*unspecified*/;

inline constexpr syntax_option_type nosubs = /*unspecified*/;
inline constexpr syntax_option_type optimize = /*unspecified*/;
inline constexpr syntax_option_type collate = /*unspecified*/;
inline constexpr syntax_option_type ECMAScript = /*unspecified*/;
inline constexpr syntax_option_type basic = /*unspecified*/;
inline constexpr syntax_option_type extended = /*unspecified*/;
inline constexpr syntax_option_type awk = /*unspecified*/;
inline constexpr syntax_option_type grep = /*unspecified*/;
inline constexpr syntax_option_type egrep = /*unspecified*/;

inline constexpr syntax_option_type multiline = /*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 オプションと同じです。

ECMAScriptbasicextendedawkgrepegrep のうち高々ひとつの文法オプションだけを選択できます。 文法を選択しない場合は 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

[編集] 関連項目

正規表現オブジェクト
(クラステンプレート) [edit]