0

I have a c++ sample and i want to find all queries inside a relative uri (like: /class?class_id=-1&course_ref=1&student_ref=2&score_ref=1). If it works, i would find all results: ( "class_id=-1" "course_ref=1" "student_ref=2" "score_ref=1: ) but only "course_ref=1" was found! Here's my code:

#include <iostream>
#include <boost/regex.hpp>

int main() {
   std::string url = "/class?class_id=-1&course_ref=1&student_ref=2&score_ref=1";

   const boost::regex queries_pattern("(?<=(\?|\&))[a-zA-Z0-9_=-]+");
   boost::smatch queries_result;
   boost::regex_search(url, queries_result, queries_pattern);

   std::string results("");

   for (unsigned int i = 0; i <= queries_result.size(); i++) {
      if (!queries_result[i].str().empty())
         std::cout << queries_result[i] << std::endl;
   }

   std::cin.get();
}

I also tried other regex patterns (without look-behind) but non of them worked. Also i tested std::regex and Boost:Xpressive and no result extracted.

Does anyone knows why this fails?? Or there's a different solution? Thanks.

mrv90
  • 3
  • 4

1 Answers1

0

I don't know why but i must loop on iterator not directly on results. Here's the worked code:

#include <iostream>
#include <boost/regex.hpp>

int main() {
    std::string url = "/class?class_id=-1&course_ref=1&student_ref=2&score_ref=1";

    const boost::regex pattern("[a-zA-Z0-9_=-]+((?=&)|(?=$))");
    boost::sregex_token_iterator iter(url.begin(), url.end(), pattern, 0);
    boost::sregex_token_iterator end;

    for (; iter != end; ++iter) {
       std::cout << *iter << '\n';
    }   

    std::cin.get();
}

Thank you "the fourth bird" for your correct point.

mrv90
  • 3
  • 4