std::regex_error语言 - 意外的转义字符

std::regex_error - Unexpected escape character

本文关键字:意外 转义字符 error regex std 语言      更新时间:2023-10-16

鉴于此代码有效

std::string pattern = "(\d+)";
std::regex iregex = std::regex(pattern, std::regex_constants::icase); 

我收到以下代码的错误

std::string pattern = "(\d+)";
std::regex iregex = std::regex(pattern, std::regex_constants::extended); 

有人可以解释一下其中的区别..??

std::regex可以与或不带有标志一起使用(第二个参数(。 如果没有修改语法的标志:(basic, extended, awk, grep, egrep(,它将默认使用 ECMAScript。 因此,像(icase,nosubs,optimize,collate(这样的标志默认使用ECMAScript语法。

现在问题中的 2 个标志详细介绍

从文档中可以看出,如果您使用std::regex_constants::extended它将

使用扩展的 POSIX 正则表达式语法语法文档。

在语法文档中,它说:

普通角色是与自身匹配的 ERE。一个平凡的 字符是支持的字符集中的任何字符,但 ERE 特殊字符中列出的 ERE 特殊字符。这 对一个普通角色的解释,前面有一个未逃脱的 ( '' ( 未定义,除非在括号的上下文中 表达式(请参阅 ERE 括号表达式(。

如您所见,d不在特殊字符列表中。

至于std::regex_constants::icase

std::regex(pattern, std::regex_constants::icase)等同于std::regex(pattern, std::regex::ECMAScript | std::regex::icase)

而 ECMAScript 语法接受d,你必须\d转义。您可以在此处阅读有关此语法的更多信息。

TL;博士

std::regex_constants::extended不知道d,只接受括号([](之间的\std::regex_constants::icase接受它,因为它使用std::regex_constants::ECMAScript语法。