2015-05-01 3 views
1

Я пытаюсь выбрать) 9 в строке сс, заменить его) * 9C++ ошибка выражения регулярного выражений (необработанное исключение)

Я получаю необработанную ошибку выражения на 2-й линии (DEF из ее). Я пробовал все комбинации строк 2, о которых я могу думать (включая двойное экранирование d).

std::string ss ("1 + (3+2)9 - 2 "); 
std::regex ee ("(\\)\d)([^ ]"); 

std::string result; 
std::regex_replace (std::back_inserter(result), ss.begin(), ss.end(), ee, "*$2"); 
std::cout << result; 
+1

Знаете ли вы, что '«\ d» 'есть? [Потому что это не означает «цифра», как большинство регулярных выражений] (http://en.cppreference.com/w/cpp/language/escape). Попробуйте избежать этой обратной косой черты. (Я ожидаю, что компилятор выдаст предупреждение об этом) – Cornstalks

+0

Какую версию компилятора вы используете? – Mat

+0

Я только что обновил описание, чтобы включить Я пробовал \\ d. В этой документации указано, что «\ d» является частью регулярного выражения C++ (что perl является стандартным типом regex): cplusplus.com/reference/regex/regex_replace/ - boost.org/doc/libs/1_58_0/libs/regex/doc /html/boost_regex/syntax/perl_syntax.html –

ответ

2

Вам нужно бежать все обратные слэши:

"(\\)\\d)([^ ]" 

В противном случае вы могли бы посылать контрольный символ в регулярном выражении, а не два символа \ и d.

Кроме того, вам необходимо либо регулярное выражение обратной косой черты для второго (:

"(\\)\\d)\\([^ ]" 

или вам нужно добавить соответствующий крупным скобку:

"(\\)\\d)([^ ])" 
+0

Спасибо. Мне не хватало последней скобки. Теперь вопрос в том, почему код выше распечатывает исходную строку без добавления «*» между ними) и 9. –

+0

Я отправлю этот вопрос отдельно. –

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