Как итерации всех совпадений регулярных выражений в 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.