Ваш исходный код и предлагаемые решения до сих пор имеют несколько проблем в дополнение к очевидной проблеме, о которой вы писали:
- использование недействительных итераторов после изменения строки
- разыменование возможно недопустимых итераторов даже до изменения строки (например, если строка пуста)
- ошибка, если строка expressionBuilder содержит только один символ '*'
Теперь, последние два элемента могут и не быть проблемой, если код, использующий фрагмент / подпрограмму, уже проверяет, что строка содержит как минимум 2 символа, но в случае, если это не так, я считаю, что следующее более устойчивый к произвольным значениям для expressionBuilder:
// using the reverse iterator rbegin() is a nice easy way
// to get the last character of a string
if ( (expressionBuilder.size() >= 2) &&
(*expressionBuilder.begin() == '*') &&
(*expressionBuilder.rbegin() == '*') ) {
expressionBuilder.erase(expressionBuilder.begin());
// can't nicely use rbegin() here because erase() wont take a reverse
// iterator, and converting reverse iterators to regular iterators
// results in rather ugly, non-intuitive code
expressionBuilder.erase(expressionBuilder.end() - 1); // note - not invalid since we're getting it anew
expressionBuilder = "\\b\\w*" + expressionBuilder + "\\w*\\b";
}
Обратите внимание, что этот код будет работать, если expressionBuilder
равен ""
, "*"
или "**"
, поскольку он не выполняет никаких неопределенных действий. Тем не менее, он может не дать желаемых результатов в этих случаях (это потому, что я не знаю точно, что вы хотите в этих случаях). Изменить в соответствии с вашими потребностями.