Понимание регулярного выражения С++ простым примером

Я написал следующий простой пример:

#include <iostream>
#include <string>
#include <regex>

int main ()
{
    std::string str("1231");
    std::regex r("^(\\d)");
    std::smatch m;
    std::regex_search(str, m, r);
    for(auto v: m) std::cout << v << std::endl;
}

DEMO

и запутался в его поведении. Если я правильно понял цель match_result из , то должен был быть напечатан только один 1. На самом деле:

В случае успеха он не пуст и содержит серию sub_match объектов: элемент first sub_match соответствует всему совпадению,и, если выражение регулярного выражения содержит подвыражения, которые должны быть сопоставлены ([...])

Строка, переданная функции, не соответствует регулярному выражению, поэтому мы должны не иметь the entire match.

Что я пропустил?

Ответ 1

Вы по-прежнему получаете полное совпадение, но все совпадение не соответствует всей строке, оно соответствует всему регулярному выражению.

Например, рассмотрим это:

#include <iostream>
#include <string>
#include <regex>

int main()
{
    std::string str("1231");
    std::regex r("^(\\d)\\d"); // entire match will be 2 numbers

    std::smatch m;
    std::regex_search(str, m, r);

    for(auto v: m)
        std::cout << v << std::endl;
}

Выход:

12
1

Полное совпадение (первый sub_match) - это то, с чем сопоставляется все регулярное выражение (часть строки).

Второй sub_match является первой (и единственной) группой захвата

Глядя на ваше оригинальное регулярное выражение

std::regex r("^(\\d)");
              |----| <- entire expression (sub_match #0)

std::regex r("^(\\d)");
               |---| <- first capture group (sub_match #1)

Вот откуда взялись два sub_matches.

Ответ 2

Из здесь

    Returns whether **some** sub-sequence in the target sequence (the subject) 
    matches the regular expression rgx (the pattern). The target sequence is 
    either s or the character sequence between first and last, depending on 
    the version used.

Таким образом, regex_search будет искать что-либо во входной строке, которая соответствует регулярному выражению. Вся строка не должна совпадать, просто ее часть.

Однако, если вы должны использовать regex_match, то строка целая должна совпадать.