我想认为这实际上并不是标准库中的错误,但我已经没有地方可以查看了。
std::regex(expression)
语句expression
是std :: string会导致内存访问致命错误。
expression
由声明声明:
std::string expression = std::string("^(") +
std::string("[\x09\x0A\x0D\x20-\x7E]|") + // ASCII
std::string("[\xC2-\xDF][\x80-\xBF]|") + // non-overlong 2-byte
std::string("\xE0[\xA0-\xBF][\x80-\xBF]|") + // excluding overlong
std::string("[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|") + // straight 3-byte
std::string("\xED[\x80-\x9F][\x80-\xBF]|") + // excluding surrogates
std::string("\xF0[\x90-\xBF][\x80-\xBF]{2}|") + // planes 1-3
std::string("[\xF1-\xF3][\x80-\xBF]{3}|") + // planes 4-15
std::string("\xF4[\x80-\x8F][\x80-\xBF]{2}") + // plane 16
")*$";
此正则表达式取自http://www.w3.org/International/questions/qa-forms-utf-8以测试字节序列是否为UTF8。
这实际上是库中的错误,还是我错过了一些非常小的东西?
使用VS2015 c ++编译,如果这恰好有所作为。
编辑:
我忘了提到这里有一个特定的行打破了代码。 std::string("[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|") + // straight 3-byte
是唯一可以打破的行。评论出来,它工作正常。它上面的这一行会产生内存访问错误。
答案 0 :(得分:1)
因此,如果在字符串文字中使用转义符,而不使用 raw 语法,则 你必须逃脱逃跑。
示例,新字符串:
std::string expression = std::string("^(") +
std::string("[\\x09\\x0A\\x0D\\x20-\\x7E]|") + // ASCII
std::string("[\\xC2-\\xDF][\\x80-\\xBF]|") + // non-overlong 2-byte
std::string("\\xE0[\\xA0-\\xBF][\\x80-\\xBF]|") + // excluding overlong
std::string("[\\xE1-\\xEC\\xEE\\xEF][\\x80-\\xBF]{2}|") + // straight 3-byte
std::string("\\xED[\\x80-\\x9F][\\x80-\\xBF]|") + // excluding surrogates
std::string("\\xF0[\\x90-\\xBF][\\x80-\\xBF]{2}|") + // planes 1-3
std::string("[\\xF1-\\xF3][\\x80-\\xBF]{3}|") + // planes 4-15
std::string("\\xF4[\\x80-\\x8F][\\x80-\\xBF]{2}") + // plane 16
")*$";
当您不转义它们时,编译器会尝试将其解释为
特殊字符。在这种情况下,它将它们解释为十六进制二进制字符。
而且,虽然正则表达式引擎可能会得到正确的字符,但是
将十六进制传递给引擎总是更好,这样你就可以看到角色
了
这可能会打破它(如果确实如此)。