Каким образом скобки этого регулярного выражения "не соответствуют"? - PullRequest
3 голосов
/ 01 мая 2019

Рассмотрим этот код C ++:

#include <iostream>
#include <regex>
#include <string>

int main()
{
    regex_match("'c'", std::regex("'[\x00-\x7F]'"));
    std::cout << "Reached!";
}

Когда я компилирую его с помощью clang ++ 8.0.0, во время выполнения происходит сбой со следующей ошибкой:

libc++abi.dylib: terminating with uncaught exception of type std::__1::regex_error: The expression contained mismatched [ and ].
Abort trap: 6

Но насколько далекоскобки не совпадают?У меня есть открывающая скобка, и она закрыта закрывающей скобкой.В чем моя ошибка?

1 Ответ

1 голос
/ 02 мая 2019

Правильный ответ уже упоминался в комментариях несколько часов назад. Поскольку комментаторы, кажется, не возвращаются, я подведу итог здесь.

Здесь \x00 - это просто \0, что обозначает конец строки в стиле C. regex создается со строкой в ​​стиле C, поэтому конструктор видит "'[" вместо желаемого "'[\x00-\x7F]'". Другими словами, строки в стиле C не могут содержать символ \0. Это объясняет, почему библиотека жалуется, что ваши скобки не совпадают.

Поскольку регулярное выражение разрешает прямое использование экранирования, вы можете позволить конструктору видеть символы \x00. Самому \ нужно экранировать, поэтому это "\\x00". Обратите внимание, что в этом случае вы передаете конструктору четыре символа вместо одного. То же самое для \x7F.

std::regex("'[\\x00-\\x7F]'")

В качестве альтернативы, вы можете использовать необработанные строки, поэтому вам не нужно избегать обратной косой черты.

std::regex(R"('[\x00-\x7F]')")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...