Boost logo

Boost Users :

Subject: [Boost-users] [Regex] Why is my RE not working?... :-)
From: Adem (adem_at_[hidden])
Date: 2008-12-27 18:45:47


Given these definitions:
   RE: " (ip=|\\(|\\[)(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})(\\]|\\)|,|;| |\n)";
   Text: "BLAH ([1.2.3.4]) [5.6.7.8] ip=100.100.200.200 BLAH2 (77.48.32.42)\n";

the following code prints:
  IP=5.6.7.8 100.100.200.200 77.48.32.42

I wonder why it skips the first IP, ie. 1.2.3.4 ?
Is there something wrong in my RE definition above, the code below, or in boost::regex?
I'm sure it's just a silly error of mine but I don't see it... :-(

...
bool GetIP(const char* ApszText, char* ARet_szIP)
   { // find all IPs in ApszText and return them via ARet_szIP (seperate 'em by a blank if multiple found)

     const char* szRe = " (ip=|\\(|\\[)(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})(\\]|\\)|,|;| |\n)";
     boost::regex re(szRe);
     string s = ApszText;
     string::const_iterator start = s.begin(), end = s.end();
     boost::match_results<string::const_iterator> what;
     boost::match_flag_type flags = boost::match_default;
     int cFound = 0;
     while (boost::regex_search(start, end, what, re, flags))
       {
         string sIP(what[2].first, what[2].second);
         if (!cFound++)
           ARet_szIP[0] = 0; // clear only if found any
         else
           strcat(ARet_szIP, " ");
         strcat(ARet_szIP, sIP.c_str());

         start = what[0].second; // set the next start pos
       }
     return cFound > 0;
   }

int main()
   {
     const char* szLine = "BLAH ([1.2.3.4]) [5.6.7.8] ip=100.100.200.200 BLAH2 (77.48.32.42)\n";

     char szIP[256] = "";
     bool f = GetIP(szLine, szIP);
     printf("IP=%s\n", szIP);

     return 0;
   }


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net