名前空間
変種
操作

std::regex_constants::syntax_option_type

From cppreference.com
< cpp‎ | regex
 
 
 
正規表現ライブラリ
クラス
(C++11)
アルゴリズム
イテレータ
例外
Traits
定数
syntax_option_type
(C++11)
(C++11)
正規表現文法
 
ヘッダ <regex> で定義
using syntax_option_type = /* 実装定義 */;
(1) (C++11以降)
constexpr syntax_option_type icase      = /* 未指定 */;

constexpr syntax_option_type nosubs     = /* 未指定 */;
constexpr syntax_option_type optimize   = /* 未指定 */;
constexpr syntax_option_type collate    = /* 未指定 */;
constexpr syntax_option_type ECMAScript = /* 未指定 */;
constexpr syntax_option_type basic      = /* 未指定 */;
constexpr syntax_option_type extended   = /* 未指定 */;
constexpr syntax_option_type awk        = /* 未指定 */;
constexpr syntax_option_type grep       = /* 未指定 */;

constexpr syntax_option_type egrep      = /* 未指定 */;
(2) (C++11以降)
(C++17以降インライン化)
inline constexpr syntax_option_type multiline = /* 未指定 */;
(3) (C++17以降)
1) syntax_option_type は、正規表現の動作を制御するオプションを含む、ビットマスク型です。
2,3)(1) の可能な値(icaseoptimize など)は、std::basic_regex 内にも重複して定義されています。

目次

[編集] 定数

文法オプション 効果
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エンジンが選択されている場合、^が行の先頭にマッチし、$が行の末尾にマッチするように指定する。

ECMAScriptbasicextendedawkgrepegrep の文法オプションからは、最大で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 指定子を削除した。

[編集] 関連項目

正規表現オブジェクト
(クラステンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)