Замена каждого совпадения регулярного выражения другим числом - PullRequest
0 голосов
/ 25 мая 2020

У меня небольшая проблема с домашним заданием. Мне нужно сделать парсер уравнения дроби, где дроби представлены a | b. Я взял все дроби из строки в вектор, и теперь я хочу заменить их в строке последующими числами, чтобы мне было легче складывать их в стек для алгоритма маневровой станции.
Например:
Изменение эта строка от
2|1+4|1*5|2-18|5
до
1+2*3-4
Если я это сделаю, я могу просто назвать нужную мне дробь числами в квотах, которые будут индексами. Было бы намного проще изменить его с инфикса на постфикс.
Проблема в том, что я действительно не знаю, как заменять каждую из этих дробей другим числом.
Мое регулярное выражение: regex reg("\\d+\|\\d+");
Это соответствует каждой дроби в строке, и теперь это та часть, где я не знаю, как продолжить.
Использование regex_replace() заменит все совпадения на то же самое.
Я бы очень одобрил некоторые помощь.

1 Ответ

1 голос
/ 25 мая 2020

Вы можете использовать std::regex_iterator и создать новую строку с замененными числами:

const std::string s = "2|1+4|1*5|2-18|5";

std::regex r("\\d+\\|\\d+");
// std::regex r(R"(\d+\|\d+)");  // as a raw-string literal, which reduces the need for backslashes

auto begin = std::sregex_iterator(s.begin(), s.end(), r);
auto end = std::sregex_iterator();

int count = 1;
std::string result;
for (std::sregex_iterator i = begin; i != end; ++i) 
    result += i->prefix().str() + std::to_string(count++);

std::cout << result << '\n'; // prints 1+2*3-4

Вот демонстрация .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...