Как итерации всех совпадений регулярных выражений в std :: string со стартовыми позициями в С++ 11 std :: regex?

Я знаю два способа получения регулярных выражений из std :: string, но я не знаю, как получить все совпадения с их соответствующими смещениями.

#include <string>
#include <iostream>
#include <regex>
int main() { using namespace std; string s = "123 apples 456 oranges 789 bananas oranges bananas"; regex r = regex("[a-z]+"); const sregex_token_iterator end; // here I know how to get all occurences // but don't know how to get starting offset of each one for (sregex_token_iterator i(s.cbegin(), s.cend(), r); i != end; ++i) { cout << *i << endl; } cout << "====" << endl; // and here I know how to get position // but the code is finding only first match smatch m; regex_search ( s, m, r ); for (unsigned i=0; i< m.size(); ++i) { cout << m.position(i) << endl; cout << m[i] << endl; }
}
</regex></iostream></string>
1 ответ

Прежде всего, почему токен-итератор? У вас нет выраженных подвыражений для перебора.

Во-вторых, position() является функцией-членом соответствия, поэтому:

#include <string>
#include <iostream>
#include <regex>
int main() { std::string s = "123 apples 456 oranges 789 bananas oranges bananas"; std::regex r("[a-z]+"); for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r); i != std::sregex_iterator(); ++i ) { std::smatch m = *i; std::cout << m.str() << " at position " << m.position() << '\n'; }
}
</regex></iostream></string>

жить в coliru: http://coliru.stacked-crooked.com/a/492643ca2b6c5dac

licensed under cc by-sa 3.0 with attribution.