C++ 参考手册
- C++11
- C++14
- C++17
- C++20
- C++ 编译器支持情况表
- 独立与宿主实现
- C++ 语言
- C++ 关键词
- 预处理器
- C++ 标准库头文件
- 具名要求
- 功能特性测试 (C++20)
- 工具库
- 类型支持(基本类型、RTTI、类型特性)
- 概念库 (C++20)
- 错误处理
- 动态内存管理
- 日期和时间工具
- 字符串库
- 容器库
- 迭代器库
- 范围库 (C++20)
- 算法库
- 数值库
- 输入/输出库
- 文件系统库
- 本地化库
- 正则表达式库
- std::sub_match
- std::match_results
- std::basic_regex
- std::regex_search
- std::regex_replace
- std::regex_iterator
- std::regex_match
- std::regex_token_iterator
- std::regex_error
- std::regex_traits
- std::regex_constants::syntax_option_type
- std::regex_constants::match_flag_type
- std::regex_constants::error_type
- 改 ECMAScript 正则表达式文法
- 注释
- 原子操作库
- 线程支持库
- 实验性 C++ 特性
- 有用的资源
- 索引
- std 符号索引
- 协程支持 (C++20)
- C++ 关键词
std::regex_constants::syntax_option_type
定义于头文件 <regex>
|
||
typedef /*unspecified*/ syntax_option_type; |
(C++11 起) | |
constexpr syntax_option_type icase = /*unspecified*/; constexpr syntax_option_type nosubs = /*unspecified*/; |
(C++11 起) (C++17 前) |
|
inline constexpr syntax_option_type icase = /*unspecified*/; inline constexpr syntax_option_type nosubs = /*unspecified*/; |
(C++17 起) | |
syntax_option_type
是含有掌控正则表达式行为方式的选项的位掩码类型 (BitmaskType) 。
此类型的可能值( icase
、 optimize
等)被复制到 std::basic_regex 中。
常量
值 | 效果 |
icase
|
应当以不考虑大小写进行字符匹配。 |
nosubs
|
进行匹配时,将所有被标记的子表达式 (expr) 当做非标记的子表达式 (?:expr) 。不将匹配存储于提供的 std::regex_match 结构中,且 mark_count() 为零
|
optimize
|
指示正则表达式引擎进行更快的匹配,带有令构造变慢的潜在开销。例如这可能表示将非确定 FSA 转换为确定 FSA 。 |
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' 。
|
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>" 会只匹配到首个闭标签。
C++11 中,这些常量曾被指定带有冗余的关键词 static
,它为 C++14 通过 LWG 问题 2053 移除。
示例
描绘匹配算法于 ECMAScript 与 POSIX 正则表达式之间的差异
#include <iostream> #include <string> #include <regex> 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++11) |
正则表达式对象 (类模板) |