Felix Dombek
Felix Dombek

Reputation: 14372

Get last match with Boost::Regex

I have a regular expression in C++ with Boost which matches lines in multi-line strings. Regex search finds the first match, however I'm interested in the last line which matches.

The code I'm using now is something like this:

matched = boost::regex_search(input, results, regex);               
if (!matched) {
    return -1; // error code
}
matched_string = results["Group"]; 

If regex was "(?<Group>Data.)" and input was "Data1 Data2 Data3", then matched_string is now "Data1". I want it to be "Data3".

Upvotes: 5

Views: 4249

Answers (1)

Ise Wisteria
Ise Wisteria

Reputation: 11669

operator[] of match_results returns a sub_match. sub_match inherits std::pair of iterators. Its first and second members correspond to matched range. So, you can use its second for start point of new search. For example:

string  input = "Data1 Data2 Data3";
regex  re("(?<Group>Data.)");
string::const_iterator  begin = input.begin(), end = input.end();
smatch  results;
while ( regex_search( begin, end, results, re ) ) {
  smatch::value_type  r = results["Group"];
  begin = r.second;
}

Hope this helps.

Upvotes: 5

Related Questions