#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