std::regex_constants::syntax_option_type
在标头 <regex> 定义
|
||
using syntax_option_type = /* 由实现定义 */; |
(C++11 起) | |
constexpr syntax_option_type icase = /* 未指定 */; constexpr syntax_option_type nosubs = /* 未指定 */; |
(C++11 起) (C++17 前) |
|
inline constexpr syntax_option_type icase = /* 未指定 */; inline constexpr syntax_option_type nosubs = /* 未指定 */; |
(C++17 起) | |
syntax_option_type
是含有掌控正则表达式行为方式的选项的位掩码类型 (BitmaskType) 。
此类型的可能值(icase
、optimize
等)会被复制到 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'。
|
最多只能选取 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 << "在 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 说明符 |
参阅
(C++11) |
正则表达式对象 (类模板) |