#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;
}