поиск регулярных выражений и сопоставление подстрок

#c #regex

#c #регулярное выражение

Вопрос:

Вот мой код:

 std::string var = "(1,2)";
std::smatch match;
std::regex rgx("[0-9] ");
if(std::regex_search(var,match,rgx))
    for (size_t i = 0; i < match.size();   i)
        std::cout << i << ": " << match[i] << 'n';
 

Я хочу иметь возможность извлекать как 1, так И 2, но пока выводится только первое совпадение (1). Кажется, я не могу понять, почему, и мой мозг поджарен. Вероятно, это что-то очевидное

Ответ №1:

regex_match элементы предназначены для сопоставления групп внутри регулярного выражения.

В слегка измененном примере

 std::string var = "(11b,2x)";
std::smatch match;
std::regex rgx("([0-9] )([a-z])");
if(std::regex_search(var,match,rgx))
    for (size_t i = 0; i < match.size();   i)
        std::cout << i << ": " << match[i] << 'n';
 

Вы получите следующий вывод:

 0: 11b
1: 11
2: b
 

То, что вы хотите, это использовать std::regex_iterator для просмотра всех совпадений:

 auto b = std::sregex_iterator(var.cbegin(), var.cend(), rgx);
auto e = std::sregex_iterator();

std::for_each(b, e, [](std::smatch constamp; m){
    cout << "match: " << m.str() << endl;
});
 

Это даст желаемый результат:

 match: 1
match: 2
 

живая демонстрация