Доморощенный способ состоит в том, чтобы использовать цикл while с regex_search (), а затем
строить выходную строку по мере продвижения.
По сути, это то, что regex_replace () делает за один проход.
Нет необходимости выполнять отдельное регулярное выражение для каждого элемента карты, который имеет накладные расходы
переназначения для каждого элемента ( s = regex_replace () ), а также для покрытия того же
недвижимость с каждым пропуском.
Примерно это регулярное выражение
(?s)
( .*? ) # (1)
(?:
\#
( \d+ ) # (2)
| $
)
с этим кодом
typedef std::string::const_iterator SITR;
typedef std::smatch X_smatch;
#define REGEX_SEARCH std::regex_search
std::regex _Rx = std::regex( "(?s)(.*?)(?:\\#(\\d+)|$)" );
SITR start = oldstr.begin();
SITR end = oldstr.end();
X_smatch m;
std::string newstr = "";
while ( REGEX_SEARCH( start, end, m, _Rx ) )
{
newstr.append( m[1].str() );
if ( m[2].matched ) {
{
// append the map keys value here, do error checking etc..
// std::string key = m[2].str();
int ndx = std::atoi( m[2].str() );
newstr.append( mymap[ ndx ] );
}
start = m[0].second;
}
// assign the old string with new string if need be
oldstr = newstr;