名稱空間
變體
操作

std::regex_constants::syntax_option_type

來自 cppreference.com
< cpp‎ | regex
在標頭檔案 <regex> 中定義
using syntax_option_type = /* implementation-defined */;
(1) (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 */;
(2) (C++11 起)
(C++17 起為 inline)
inline constexpr syntax_option_type multiline = /* unspecified */;
(3) (C++17 起)
1) syntax_option_type 是一個 BitmaskType,包含控制正則表示式行為的選項。
2,3) 型別 (1) 的可能值(icaseoptimize 等)在 std::basic_regex 中重複。

目錄

[編輯] 常量

語法選項 效果
ECMAScript 使用 Modified 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 指示正則表示式引擎加快匹配速度,潛在代價是構造速度變慢。例如,這可能意味著將非確定性 FSA 轉換為確定性 FSA。
collate 形式為 "[a-b]" 的字元範圍將對區域設定敏感。
multiline (C++17 起) 如果選擇 ECMAScript 引擎,指定 ^ 匹配行首,$ 匹配行尾。

ECMAScript, basic, extended, awk, grep, egrep 中最多隻能選擇一個語法選項。如果沒有選擇語法,則假定選擇 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++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 2053 C++11 常量被宣告為 static 移除了 static 說明符

[編輯] 參閱

正則表示式物件
(類模板) [編輯]