Мусорные символы после regex_replace - PullRequest
0 голосов
/ 11 апреля 2019

Я использую boost xpressive regex_replace.После замены я получаю символы мусора в конце строки

std::wstring wEsc(L"fxSSyrpng");
std::wstring wReplaceByText(L"tiff");
std::wstring searchText(L"fx");

wsregex regExp;
try
{
    regExp = wsregex::compile( searchText );
}
catch ( regex_error &/*error*/ )
{
    throw ;
}
catch (...)
{
    throw ;
}
std::wstring strOut;
strOut.reserve( wEsc.length() + wReplaceByText.length() );
std::wstring::iterator it = strOut.begin();
boost::xpressive::regex_replace( it, wEsc.begin() , wEsc.end(), regExp, 
wReplaceByText,   regex_constants::match_not_null  );

1 Ответ

0 голосов
/ 11 апреля 2019

После reserve строка strOut имеет еще 0 элементов.Таким образом, strOut.begin() == strOut.end() является истинным, а it указывает ни на что.Если вы хотите использовать выходной итератор для записи данных в regex_replace, it должен указывать на память с достаточным пространством для хранения всех данных.Вы можете исправить это, вызвав resize вместо reserve.

Другое решение - использовать back_inserter для выполнения этой работы (operator= на этом итераторе выдвигать данные в string), затем it не требуется, а код выглядит так:

std::wstring strOut;
boost::xpressive::regex_replace( std::back_inserter(strOut), wEsc.begin() , wEsc.end(), regExp, 
wReplaceByText,   boost::xpressive::regex_constants::match_not_null  );
...