Почему исключение с этим шаблоном регулярного выражения (tr1 :: regex)? - PullRequest
1 голос
/ 02 марта 2010

У меня возникла очень странная проблема с tr1 :: regex (VS2008), причина которой я не могу выяснить. Код в конце поста компилируется нормально, но выдает исключение при достижении 4-го определения регулярного выражения во время выполнения:

Исключение Microsoft C ++: std :: tr1 :: regex_error в ячейке памяти 0x0012f5f4 ..

Однако единственное различие, которое я вижу (возможно, я слеп) между 3-м и 4-м, - это NumberOfComponents вместо SchemeVersion. Сначала я подумал, что, возможно, оба (3-й и 4-й) ошибочны, а ошибка от 3-го только что сработала в 4-м. Похоже, что это не так, поскольку я переместил их обоих и поместил несколько других определений регулярных выражений между ними. Строка всегда вызывает исключение.

Кто-нибудь знает, почему эта строка

std::tr1::regex rxNumberOfComponents("\\NumberOfComponents:(\\s*\\d+){1}");

вызывает исключение, но

std::tr1::regex rxSchemeVersion("\\SchemeVersion:(\\s*\\d+){1}");

нет? Время выполнения просто мешает мне?

Спасибо за время, чтобы прочитать это и за любые идеи.
T

PS: Я полностью уверен, что решение настолько простое, что я должен ударить головой о ближайшую стену, чтобы выровнять карму «глупого вопроса» ...


#include <regex>

int main(void)
{
   std::tr1::regex rxSepFileIdent("Scanner Separation Configuration");
   std::tr1::regex rxScannerNameIdent("\\ScannerName:((\\s*\\w+)+)");

   std::tr1::regex rxSchemeVersion("\\SchemeVersion:(\\s*\\d+){1}");
   std::tr1::regex rxNumberOfComponents("\\NumberOfComponents:(\\s*\\d+){1}");

   std::tr1::regex rxConfigStartIdent("Configuration Start");
   std::tr1::regex rxConfigEndIdent("Configuration End");

   return 0;
}

1 Ответ

2 голосов
/ 02 марта 2010

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

Тот, который начинается с S, работает, потому что \S является допустимым экранированием регулярного выражения (непробельные символы) Тот, который начинается с N, не (потому что \N не является допустимым экранированием регулярного выражения).

Вместо этого используйте "\\\\SchemeVersion: и так далее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...