|
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