You cannot use the current approach, since std::regex does not allow storing of the captured values in memory, each time a part of the string is captured, the former value in the group is re-written with the new one, and only the last value captured is available after a match is found and returned. And since you defined 3 capturing groups in the pattern, you have 3+1 groups in the output. 
Mind also, that std::regex_search only returns one match, while you will need multiple matches here. 
So, what you may do is to perform 2 steps: 1) validate the string using the pattern you have (no capturing is necessary here), 2) extract the digits (or split with a comma, that depends on the requirements).
A C++ demo:
#include <string>
#include <iostream>
#include <regex>
using namespace std;
int main() {
    std::regex rx_extract("[0-9]+");
    std::regex rx_validate(R"(^\d+(?:,\d+)*$)");
    std::string s = "1,2,3,5";
    if (regex_match(s, rx_validate)) {
        for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), rx_extract);
                                 i != std::sregex_iterator();
                                 ++i)
        {
            std::smatch m = *i;
            std::cout << m.str() << '\n';
        }
    }
    return 0;
}
Output:
1
2
3
5