std::regex_constants::syntax_option_type

来自cppreference.com
< cpp‎ | regex
在标头 <regex> 定义
using syntax_option_type = /* 由实现定义 */;
(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      = /* 未指定 */;
(C++11 起)
(C++17 前)
inline constexpr syntax_option_type icase =      /* 未指定 */;

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

inline constexpr syntax_option_type multiline =  /* 未指定 */;
(C++17 起)

syntax_option_type 是含有掌控正则表达式行为方式的选项的位掩码类型 (BitmaskType)

此类型的可能值(icaseoptimize 等)会被复制到 std::basic_regex 中。

常量

效果
icase 应当以不考虑大小写进行字符匹配。
nosubs 进行匹配时,将所有被标记的子表达式 (expr) 当做非标记的子表达式 (?:expr)。不将匹配存储于提供的 std::regex_match 结构中,且 mark_count() 为零。
optimize 指示正则表达式引擎进行更快的匹配,带有令构造变慢的潜在开销。例如这可能表示将非确定有限状态机转换为确定有限状态机。
collate 形如 "[a-b]" 的字符范围将对本地环境敏感。
multiline (C++17) 如果选择 ECMAScript 引擎,那么指定 ^ 应该匹配行首,而 $ 应该匹配行尾。
ECMAScript 使用改 ECMAScript 正则表达式文法
basic 使用基本 POSIX 正则表达式文法(文法文档)。
extended 使用扩展 POSIX 正则表达式文法(文法文档)。
awk 使用 POSIX 中 awk 工具所用的正则表达式文法(文法文档)。
grep 使用 POSIX 中 grep 工具所用的正则表达式文法。这等效于 basic 选项附带作为另一种分隔符的换行符 '\n'
egrep 使用 POSIX 中 grep 工具带 -E 选项所用的正则表达式文法。这等效于 extended 附带 '|' 之外的作为另一种分隔符的换行符 '\n'

最多只能选取 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>" 会只匹配到首个闭标签。

示例

展示 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 << "在 zzxayyzz 中搜索 .*(a|xayy):\n";
    std::smatch m;
    std::regex_search(str, m, re1);
    std::cout << "  ECMA(深度优先搜索) 匹配到:" << m[0] << '\n';
    std::regex_search(str, m, re2);
    std::cout << "  POSIX(最左最长序列)匹配到:" << m[0] << '\n';
}

输出:

在 zzxayyzz 中搜索 .*(a|xayy):
  ECMA(深度优先搜索) 匹配到:zzxa
  POSIX(最左最长序列)匹配到:zzxayy

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 2053 C++11 常量被声明为 static 移除 static 说明符

参阅

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