鉴于此代码有效
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);
有人可以解释一下区别吗??
答案 0 :(得分:1)
std::regex
可以带有或不带有标志(第二个参数)使用。
如果没有标志用于修改语法:(基本,扩展,awk,grep,egrep),则默认情况下将使用ECMAScript。
因此,默认情况下,(标记,nosubs,optimize,collate)之类的标志会使用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的更多信息。
std::regex_constants::extended
不了解\d
,仅在方括号(\\
)之间接受[]
。
std::regex_constants::icase
之所以接受它,是因为它使用了std::regex_constants::ECMAScript
语法。