std::regex_constants::syntax_option_type
在标头 <regex> 定义 | ||
using syntax_option_type =/* 由实现定义 */; | (1) | (C++11 起) |
constexpr syntax_option_type icase =/* 未指定 */; constexpr syntax_option_type nosubs =/* 未指定 */; | (2) | (C++11 起) (C++17 起 inline) |
inlineconstexpr syntax_option_type multiline =/* 未指定 */; | (3) | (C++17 起) |
目录 |
[编辑]常量
文法选项 | 效果 |
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 引擎,那么指定 ^ 应该匹配行首,而 $ 应该匹配行尾。 |
在文法选项 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)");// 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 说明符 |
[编辑]参阅
(C++11) | 正则表达式对象 (类模板) |