Question

In Perl, I can do this:

$text = '1747239';
@matches = ($text =~ m/(\d)/g);
# @matches now contains ('1', '7', '4', '7', '2', '3', '9')

Using C++ regex matching, what's the best way to replicate this behaviour so that I get a match set including all the matches?

I have this at the moment:-

compiledRegex = std::regex(regex, std::tr1::regex_constants::extended);
regex_search(text, results, compiledRegex);

int count = results.size();
// Alloc pointer array based on count * sizeof(mystruct).
for ( std::cmatch::iterator match = results.begin(); 
      match != results.end(); 
      ++match )
{
    // Do something with match;
}

However this will only give me the first match, just like Perl without the /g which is fine, but I'd like the /g effect.

So, is there a good way to do it, or must I keep running the regex over and over?

Was it helpful?

Solution

You should call regex_search several times. Its return value specifies whether there are more matches. Each time you call it you get a new match. The iterator returned by results goes over the group submatches defined in your regular expression. The first entry is always the entire match, that's why in your case count == 1

std::string::const_iterator text_iter = text.cbegin();
compiledRegex = std::regex(regex, std::tr1::regex_constants::extended);

while (regex_search(text_iter, text.end(), results, compiledRegex))
{
    int count = results.size();
    // Alloc pointer array based on count * sizeof(mystruct).
    for ( std::cmatch::iterator group = results.begin();
          group != results.end();
          ++group )
    {
        // If you uses grouping in your search here you can access each group
    }

   std::cout << std::string(results[0].first, results[0].second) << endl;
   text_iter = results[0].second;
}

Hope it helps

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top