2015-06-11 3 views
1

Я писал регулярное выражение, чтобы извлечь каталог и имя файла. Я тестировал его в тесте регулярных выражений и, похоже, там работает, но когда я запускаю его в своей программе на C++, он сбой.Почему это регулярное выражение приводит к сбою моей программы?

regex re("^(.*)(\\/|\\\)(.*\\.flt)$"); 

Я компилирую с Visual Studio 2010 SP1. Когда я запускаю код, он разбивается на указанную выше строку. Зачем?

Edit: исключение я получаю

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

И это разбивает в строке 19 regex.cpp

+1

Определите, «он падает» и «он ломается». Мы не можем вам помочь, если вы не скажете нам, что происходит. Вы не ожидали, что коронер напишет о смерти, «он умер». –

+2

Вы можете пропустить '\' at '| \ \ \) ' –

+3

Используйте [C++ raw string литералы] (http://en.cppreference.com/w/cpp/language/string_literal) для регулярных выражений. Они сделают вашу жизнь намного легче. _ «Visual Studio 2010 SP1» _ Вам действительно нужно использовать такой старый компилятор для реализации вашего кода? –

ответ

2

Проблема заключается в том, что вы спасаясь обратную косую черту неверно:

(\\/|\\\) 

, который, как предполагается, означает «вперед или обратный слеш «будет трансформироваться компилятором в первую очередь. Каждая пара символов, начинающаяся с обратной косой черты, будет заменена одним символом, основанным на escape-последовательности.

\\ является допустимой escape-последовательностью, представляющей \. \), однако, не является допустимой escape-последовательностью, поэтому он будет заменен на ). Таким образом, регулярное выражение конструктор будет «видеть» это:

(\/|\) 

Это избежит закрывающую скобку, что приводит к синтаксической ошибке.

Классы символов обеспечивают лучший синтаксис для вашей ситуации: вместо круглых скобках «ИЛИ» группе, используют один

[/\\\\] 

После C++ заменяет управляющие последовательности, регулярное выражение конструктор будет видеть эту конструкцию,

[/\\] 

, что означает «передняя или задняя косая черта».

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