Следующий код сделает то, что вы просите. Это не очень эффективно, потому что он находит число дважды (один раз с std::regex_search
, один раз с std::string::find
), но он заменит цифры 0 - 10 словами ноль - десять.
#include <iostream>
#include <regex>
#include <string>
int main()
{
std::vector<std::string> numbers {
"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" };
std::string text = "These numbers: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 are text now";
std::string tmp_text = text;
std::regex pattern("(\\d)+");
std::smatch result;
int n;
std::string buffer;
std::size_t pos;
while (std::regex_search(tmp_text, result, pattern))
{
buffer = result[0];
n = atoi(buffer.c_str());
switch (n)
{
case 0:
pos = text.find('0');
text.replace(pos, 1, numbers[0]);
break;
case 1:
pos = text.find('1');
text.replace(pos, 1, numbers[1]);
break;
case 2:
pos = text.find('2');
text.replace(pos, 1, numbers[2]);
break;
case 3:
pos = text.find('3');
text.replace(pos, 1, numbers[3]);
break;
case 4:
pos = text.find('4');
text.replace(pos, 1, numbers[4]);
break;
case 5:
pos = text.find('5');
text.replace(pos, 1, numbers[5]);
break;
case 6:
pos = text.find('6');
text.replace(pos, 1, numbers[6]);
break;
case 7:
pos = text.find('7');
text.replace(pos, 1, numbers[7]);
break;
case 8:
pos = text.find('8');
text.replace(pos, 1, numbers[8]);
break;
case 9:
pos = text.find('9');
text.replace(pos, 1, numbers[9]);
break;
case 10:
pos = text.find("10");
text.replace(pos, 2, numbers[10]);
break;
}
tmp_text = result.suffix().str();
}
std::cout << text << std ::endl;
}
// output:
// These numbers: zero, one, two, three, four, five, six, seven, eight, nine, ten are text now