2010-03-02 4 views
1

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

исключения

Microsoft C++: станд :: 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; 
} 
+0

Что произойдет, если вы измените строку rxSchemeVersion, чтобы также сказать «NumberOfComponents»? –

+0

'std :: tr1 :: regex_error' довольно общий. Каков код ошибки (выведите исключение как (например,) 'rerr' и напечатайте' rerr.code() ')? Сравните результат с константами 'std :: tr1 :: regex_constants :: error_type' (http://msdn.microsoft.com/en-us/library/bb982845(lightweight).aspx), чтобы выяснить, какие ошибки (-ы) вы имеете дело с. – outis

ответ

2

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

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

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

+0

Спасибо всем за быстрый ответ (особенно Дав и Влад) ... Я собираюсь пойти и сделать вмятину в своей кабинке сейчас, чтобы спросить ...: D – Tobias

Смежные вопросы