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

时间:2019-08-22 07:46:54

标签: c++ regex c++11 c++17

鉴于此代码有效

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); 

有人可以解释一下区别吗??

1 个答案:

答案 0 :(得分:1)

std::regex可以带有或不带有标志(第二个参数)使用。 如果没有标志用于修改语法:(基本,扩展,awk,grep,egrep),则默认情况下将使用ECMAScript。 因此,默认情况下,(标记,nosubs,optimize,collat​​e)之类的标志会使用ECMAScript语法。

现在详细说明问题中的2个标记

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

  

使用扩展的POSIX正则表达式语法grammar documentation

在语法文档中说:

  

普通字符是与自己匹配的ERE。一个普通的   字符是支持的字符集中的任何字符,除了   ERE Special Characters中列出的ERE特殊字符。的   解释普通字符后再进行转义    ('\')未定义,除非在方括号中   表达式(请参见ERE Bracket Expression)。

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

关于std::regex_constants::icase

std::regex(pattern, std::regex_constants::icase)std::regex(pattern, std::regex::ECMAScript | std::regex::icase)等效。

ECMAScript语法接受\d,因此必须\\d对此进行转义。您可以阅读有关此语法here的更多信息。

TL; DR

std::regex_constants::extended不了解\d,仅在方括号(\\)之间接受[]std::regex_constants::icase之所以接受它,是因为它使用了std::regex_constants::ECMAScript语法。