Правильный ответ уже упоминался в комментариях несколько часов назад. Поскольку комментаторы, кажется, не возвращаются, я подведу итог здесь.
Здесь \x00
- это просто \0
, что обозначает конец строки в стиле C. regex
создается со строкой в стиле C, поэтому конструктор видит "'["
вместо желаемого "'[\x00-\x7F]'"
. Другими словами, строки в стиле C не могут содержать символ \0
. Это объясняет, почему библиотека жалуется, что ваши скобки не совпадают.
Поскольку регулярное выражение разрешает прямое использование экранирования, вы можете позволить конструктору видеть символы \x00
. Самому \
нужно экранировать, поэтому это "\\x00"
. Обратите внимание, что в этом случае вы передаете конструктору четыре символа вместо одного. То же самое для \x7F
.
std::regex("'[\\x00-\\x7F]'")
В качестве альтернативы, вы можете использовать необработанные строки, поэтому вам не нужно избегать обратной косой черты.
std::regex(R"('[\x00-\x7F]')")