Понимание регулярного выражения С++ простым примером
Я написал следующий простой пример:
#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, то строка целая должна совпадать.