how to iterate all regex matches in a std::string with their starting positions in c++11 std::regex?

11,431

First of all, why token iterator? You don't have any marked subexpressions to iterate over.

Second, position() is a member function of a match, so:

#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';
    }
}

live at coliru: http://coliru.stacked-crooked.com/a/492643ca2b6c5dac

Share:
11,431
rsk82
Author by

rsk82

Updated on June 14, 2022

Comments

  • rsk82
    rsk82 almost 2 years

    I know two ways of getting regex matches from std::string, but I don't know how to get all matches with their respective offsets.

    #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;
      }
    }