Почему std::regex_search так работает?
Ожидаю, что вызов std::regex_search(..) должен сохранить в std::smatch все найденные результаты поиска. Однако находит только одно совпадение. Не могу понять, в чем причина. Буду благодарен за любую помощь.
#include <iostream>
#include "regex"
int main(void)
{
const std::string data("123 78");
const std::regex regex("[0-9]+");
std::smatch match;
const bool res = std::regex_search(data, match, regex);
std::cout << "res = " << (res ? "true" : "false") << std::endl;
std::cout << "match.size() = " << match.size() << std::endl;
std::cout << "match[0].str() = " << match[0].str() << std::endl;
std::cout << "match[1].str() = " << match[1].str() << std::endl;
return 0;
}
Вывод
res = true
match.size() = 1
match[0].str() = 123
match[1].str() =
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Понимаете, эта функция ищет первое же вхождение, а все эти match[1] и прочие - на случай наличия групп:
const std::string data("123 78");
const std::regex regex("([0-9])([0-9]+)");
std::smatch match;
const bool res = std::regex_search(data, match, regex);
std::cout << "res = " << (res ? "true" : "false") << std::endl;
std::cout << "match.size() = " << match.size() << std::endl;
std::cout << "match[0].str() = " << match[0].str() << std::endl;
std::cout << "match[1].str() = " << match[1].str() << std::endl;
std::cout << "match[2].str() = " << match[2].str() << std::endl;
Смотрите - теперь есть две группы - первый символ, остальные. Поэтому в match[0] вы получаете всю подстроку, а в match[1] и match[2] - подстроки, соответствующие группам.
То, что вы хотите - делается с помощью sregex_iterator:
int main()
{
const std::string data("123 78");
const std::regex rg("[0-9]+");
auto begin = std::sregex_iterator(data.begin(), data.end(), rg),
end = std::sregex_iterator();
for(auto i = begin; i != end; ++i)
{
std::smatch match = *i;
std::cout << match.str() << std::endl;
}
}