std :: regex致命错误

时间:2016-02-08 19:12:50

标签: regex visual-c++

我想认为这实际上并不是标准库中的错误,但我已经没有地方可以查看了。

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是唯一可以打破的行。评论出来,它工作正常。它上面的这一行会产生内存访问错误。

1 个答案:

答案 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
    ")*$";

当您不转义它们时,编译器会尝试将其解释为
特殊字符。在这种情况下,它将它们解释为十六进制二进制字符。

而且,虽然正则表达式引擎可能会得到正确的字符,但是 将十六进制传递给引擎总是更好,这样你就可以看到角色
了 这可能会打破它(如果确实如此)。