簡體   English   中英

std :: regex致命錯誤

[英]std::regex fatal error

我想認為這實際上不是標准庫中的錯誤,但是我已經無處可去了。

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是唯一的中斷。 評論出來,它工作正常。 此行本身會產生內存訪問錯誤。

因此,如果您在字符串文字中使用轉義符而不使用原始語法,
你必須逃脫。

示例,新字符串:

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

當您不轉義它們時,編譯器會嘗試將其解釋為
特殊字符。 在這種情況下,它將那些解釋為十六進制二進制字符。

而且,盡管正則表達式引擎可能具有正確的字符,
最好將十六進制傳遞給引擎,以便您可以看到字符
可能會破壞它(如果確實存在)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM