std::regex_constants::syntax_option_type

来自cppreference.com
< cpp‎ | regex
在标头 <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)
inlineconstexpr syntax_option_type multiline =/* 未指定 */;
(3) (C++17 起)
1)syntax_option_type 是含有掌控正则表达式行为方式的选项的位掩码类型(BitmaskType)
2,3) 类型 (1) 的可能值(icaseoptimize 等)被复制到 std::basic_regex 中。

目录

[编辑]常量

文法选项 效果
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 指示正则表达式引擎进行更快的匹配,带有令构造变慢的潜在开销。例如这可能表示将非确定有限状态机转换为确定有限状态机。
collate 形如 "[a-b]" 的字符范围将对本地环境敏感。
multiline(C++17) 如果选择 ECMAScript 引擎,那么指定 ^ 应该匹配行首,而 $ 应该匹配行尾。

在文法选项 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)");// ECMAstd::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 说明符

[编辑]参阅

正则表达式对象
(类模板)[编辑]
close