std::regex_constants::syntax_option_type
在头文件 <regex> 中定义 |
||
using syntax_option_type = /* implementation-defined */; |
(1) | (C++11 起) |
constexpr syntax_option_type icase = /* unspecified */; constexpr syntax_option_type nosubs = /* unspecified */; |
(2) | (C++11 起) (C++17 起为 inline) |
inline constexpr syntax_option_type multiline = /* unspecified */; |
(3) | (C++17 起) |
目录 |
[编辑] 常量
语法选项 | 效果 |
ECMAScript
|
使用 Modified 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
|
指示正则表达式引擎加快匹配速度,潜在代价是构造速度变慢。例如,这可能意味着将非确定性 FSA 转换为确定性 FSA。 |
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 使用“最左最长”匹配规则(匹配最长的子序列,如果存在多个这样的子序列,则匹配第一个),因此它不适合解析标记语言,例如:POSIX 正则表达式如 "<tag[^>]*>.*</tag>" 将匹配从第一个 "<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 << "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++ 标准。
缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
---|---|---|---|
LWG 2053 | C++11 | 常量被声明为 static | 移除了 static 说明符 |
[编辑] 参阅
(C++11) |
正则表达式对象 (类模板) |