std::regex_error в ячейке памяти

#c #regex

#c #регулярное выражение

Вопрос:

У меня есть регулярное выражение в виде:

 std::regex regexp(
        R"($ part, model.*[nr]([-]?[0-9]*.?[0-9] [Ee]?[- ]?[0-9]*),([-]?[0-9]*.?[0-9] [Ee]?[- ]?[0-9]*))",std::regex::extended);
 

Код компилируется, но я получаю следующую ошибку:

 Unhandled exception at 0x748F49C2 in regex.exe: Microsoft C   exception: std::regex_error at memory location 0x00EFEE30.
 

Комментарии:

1. Я предлагаю вам удалить std::regex::extended , использовать вариант ECMAScript по умолчанию.

2. Но моя строка состоит из нескольких строк. много » n».

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

4. Если вы поймаете исключение, вы увидите regex_error(error_escape): The expression contained an invalid escaped character, or a trailing escape.

5. externded синтаксис позволяет экранировать только определенные специальные символы обратной косой чертой, а не любым произвольным символом. В частности, пробел не является специальным символом и недопустим в расширенном синтаксисе. Так n и r кажется; эти символы должны быть представлены сами по себе (что было бы сложно в необработанном строковом литерале). В целом, вы, вероятно, не хотите extended ; вы, вероятно, ищете multiline вариант.

Ответ №1:

Согласно спецификации регулярных выражений, эффект экранирования пробела (который не является специальным символом) не определен:

9.4.2. Обычные символы

… Интерпретация обычного символа, которому предшествует неэкранированная <обратная косая черта> ( ), не определена, за исключением контекста выражения в скобках …

По-видимому, в реализации MSVC std::regex_error выбрасывается.

После исправления экранирования регулярное выражение компилируется.

 try {
    std::regex regexp(
        R"($ part, model.*[nr]([-]?[0-9]*.?[0-9] [Ee]?[- ]?[0-9]*),([-]?[0-9]*.?[0-9] [Ee]?[- ]?[0-9]*))", std::regex::extended);
}
catch (std::exception constamp; e) {
    std::cerr << e.what() << std::endl;
}