Namespaces
Variants

std::regex_constants:: syntax_option_type

From cppreference.net
定义于头文件 <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 是一个 BitmaskType ,包含控制正则表达式行为方式的选项。
2,3) 类型 (1) 的可能取值( icase optimize 等)在 std::basic_regex 内部被重复定义。

目录

常量

语法选项 作用
ECMAScript 使用 改进的ECMAScript正则表达式语法
basic 使用基本POSIX正则表达式语法( 语法文档 )。
extended 使用扩展POSIX正则表达式语法( 语法文档 )。
awk 使用POSIX中 awk 工具采用的正则表达式语法( 语法文档 )。
grep 使用POSIX中 grep 工具采用的正则表达式语法。这实际上等同于 basic 选项,但增加了换行符 ' \n ' 作为候选项分隔符。
egrep 使用POSIX中带 -E 选项的 grep 工具采用的正则表达式语法。这实际上等同于 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采用"最左最长"匹配规则(匹配最长的子序列,当存在多个这样的子序列时匹配第一个),它不适用于例如解析标记语言:像 "<tag[^>]*>.*</tag>" 这样的POSIX正则表达式会匹配从第一个 "<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 说明符

参见

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