Хотелось бы думать, что на самом деле это не ошибка в стандартной библиотеке, но у меня заканчиваются места для поиска.std :: regex fatal error
Заявление std::regex(expression)
, где expression
является строкой std ::, вызывает фатальную ошибку доступа к памяти.
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, чтобы проверить последовательность байт, является ли UTF-8.
На самом деле это ошибка в библиотеке, или я пропущу что-то действительно крошечное?
Составлено с VS2015 C++, если это имеет значение.
EDIT: Я забыл упомянуть, что в этом есть одна конкретная строка, которая разбивает код. std::string("[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|") + // straight 3-byte
- единственная линия, которая ломается. прокомментируйте это, и все работает отлично. Эта строка сама по себе создает ошибку доступа к памяти.
Вам нужно удвоить escape-обратную косую черту в неровном строковом литерале. Лучше всего использовать сырые строковые литералы. Попробуйте заменить все '\ x' на' \\ x'. –
C++ требует, чтобы экраны были экранированы в строковых литералах, если не использовать новый синтаксис raw. – sln
В этом примере вы используете сайт, он использует '\ A ,, \ z' по какой-то причине. Вы не должны использовать '^ .. $', поскольку это не то же самое. – sln