Несохраняющие скобки в C++
Скобки ( ) выполняют две функции -
группировка символов и функцию кармана. А
что делать, если нужно сгруппировать, но
в карман не класть? Для решения такой
проблемы придуманы специальные несохраняющие
скобки (?: ) - они группируют,
но не кладут в карман.
В следующем примере первые скобки нам нужны для группировки, а вторые - для кармана. Однако, и те, и другие скобки сохраняют данные в карман:
std::string txt = "abab123"
std::regex re(R"rx((ab)+([1-9]+))");
std::smatch res;
std::regex_search(txt, res, re);
В результате в наших карманах будет следующее:
std::cout << res.str(0) << "\n" // выведет 'abab123'
std::cout << res.str(1) << "\n" // выведет 'ab'
std::cout << res.str(2) << "\n" // выведет '123'
Сделаем так, чтобы первая пара скобок только группировала, но не клала в карман:
std::string txt = "abab123"
std::regex re(R"rx((?:ab)+([1-9]+))");
std::smatch res;
std::regex_search(txt, res, re);
В результате в первом кармане будет наше число:
std::cout << res.str(1) << "\n" // выведет '123'