命名空间
变体
操作

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 constexpr syntax_option_type multiline = /* unspecified */;
(3) (自 C++17 起)
1) syntax_option_type 是一个 BitmaskType,包含控制正则表达式行为的选项。
2,3) 类型 (1) 的可能值 (icaseoptimize 等) 在 std::basic_regex 中被复制。

内容

[edit] 常量

语法选项 效果
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 指示正则表达式引擎使匹配更快,代价可能是使构造更慢。例如,这可能意味着将非确定性 FSA 转换为确定性 FSA。
collate 形式为 "[a-b]" 的字符范围将是区域设置敏感的。
multiline (C++17) 指定如果选择了 ECMAScript 引擎,则 ^ 应匹配行的开头,而 $ 应匹配行的结尾。

最多只能从 ECMAScriptbasicextendedawkgrepegrep 中选择一个语法选项。如果未选择任何语法,则假定选择了 ECMAScript。其他选项充当变体,因此 std::regex("meow", std::regex::icase) 等同于 std::regex("meow", std::regex::ECMAScript|std::regex::icase).

[edit] 注释

由于 POSIX 使用“最左最长”匹配规则(匹配最长的匹配子序列,如果有多个这样的子序列,则匹配第一个子序列),因此它不适合例如解析标记语言:POSIX 正则表达式,例如 "<tag[^>]*>.*</tag>" 将匹配从第一个 "<tag" 到最后一个 "</tag>" 的所有内容,包括中间的每个 "</tag>""<tag>"。另一方面,ECMAScript 支持非贪婪匹配,而 ECMAScript 正则表达式 "<tag[^>]*>.*?</tag>" 将只匹配到第一个结束标记。

[edit] 示例

说明 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

[edit] 缺陷报告

以下行为更改缺陷报告已追溯应用于以前发布的 C++ 标准。

DR 应用于 已发布的行为 正确的行为
LWG 2053 C++11 常量被声明为 static 删除了 static 说明符

[edit] 另请参阅

正则表达式对象
(类模板) [edit]