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
Author by
rsk82
Updated on June 14, 2022Comments
-
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; } }