I’m using boost::regex_match and I’m trying to find a function to obtain the position where the regular expression stopped matching. I couldn’t find any attribute in the boost::match_results object, but several code snippets in which boost::regex_search is used to show the submatches. Am I on the right path with my implementation or do I’ve to do something different in order to achieve that? My code looks as follows:
int main(int args, char** argv)
{
boost::match_results<std::string::const_iterator> what;
if(args == 3)
{
std::string text(argv[1]);
boost::regex expression(argv[2]);
std::cout << "Text : " << text << std::endl;
std::cout << "Regex: " << expression << std::endl;
if(boost::regex_match(text, what, expression, boost::match_default) != 0)
{
int i = 0;
for(boost::match_results<std::string::const_iterator>::const_iterator it=what.begin(); it!=what.end(); ++it)
{
std::cout << "[" << (i++) << "] " << it->str() << std::endl;
}
std::cout << "Matched!" << std::endl;
}
else
{
std::string::const_iterator start = text.begin();
std::string::const_iterator end = text.end();
while(boost::regex_search(start, end, what, expression))
{
std::string submatch(what[1].first, what[1].second);
std::cout << submatch << std::endl;
start = what[0].second;
}
std::cout << "Didn't match!" << std::endl;
}
} //if(args == 3)
else
{
std::cout << "Invalid usage! $> ./boost-regex <text> <regex>" << std::endl;
}
return 0;
}
Output:
$> ./boost_regex "We're building it up to burn it down" ".*(build.*)(to.*)(burn.*)"
Text : We're building it up to burn it down
Regex: .*(build.*)(to.*)(burn.*)
[0] We're building it up to burn it down
[1] building it up
[2] to
[3] burn it down
Matched!
$> ./boost_regex "We're building it up to burm it down" ".*(build.*)(to.*)(burn.*)"
Text : We're building it up to burm it down
Regex: .*(build.*)(to.*)(burn.*)
Didn't match!
For the last input I’d like to have the something similar to:
Text : We're building it up to burm it down
Regex: .*(build.*)(to.*)(burn.*)
[0] We're building it up to
[1] building it up
[2] to
Didn't match!
Thanks in advance …
To start with, you have a problem with the regex in your example. Because it can’t match the
(burn.*)subgroup, the entire regex fails to match anything, and returns no results. Adding a “?” after(burn.*)would make it so the first two subgroups would match, and the third would not.I would checkout rubular.com, it’s a great tool for tweaking your regular expressions and watching them work in realtime.
To test if a subgroup did or did not participate in a match, you need to check the
sub_match::matchedboolean variable in your for loop, it will be true if the subgroup matched. check the documentation for boost::submatch hereHope this helped, it’s actually my first Stackoverflow post, answer, or comment. 🙂