Boost logo

Boost Users :

From: llwaeva_at_[hidden]
Date: 2007-03-16 02:45:23


Hi there,
 First of all, sorry for so many questions on using of regex. Actually, I am a beginner of regular expression; it is hard
for me to understand some terms in document.

I am going to extract a string in some pattern like

#P{EXP_BEING_EXTRACTED}

here, EXP_BEING_EXTRACTED is any expression which I want. For instance, xyz in #P{xyz} and 123_456 in #P{123_456}. But,
I also need to ignore the case with double # as prefix, i.e. the output of ##P{123} should be kept unchanged. I use
regex_search

 string source; // source contains the text being handled #P{x} or ##P{x} may occur
boost::regex regexp;
 string::const_iterator start, end;
 boost::match_results<std::string::const_iterator> what;
 boost::match_flag_type flags = boost::match_default;

regexp = "[#]\{1\}P[{]\([^}]*\)[}]";

start = source.begin();
end = source.end();
if ( regex_search(start, end, what, regexp, flags) )
 {
    // get the expression inside {} here
   // 1) get the text: string( what[1].first, what[1].second)
   // 2) replace the whole matched string, i.e., replace string(what[0].first, what[1].second);
}

The code above is fine for #P{x}; however, for the case ##P{x} regex_search still returns true. It seems that the
regex_search firstly found the ##P{x} which is not match the regular expression; then, it go ahead from the second # and
do the match again, so it found #P{x} finally. I don't know if the process is similiar to what I depict. Anyway, I just
want to know how can I ignore the case ##P{x}. I try to modify the regular expression as follow

regexp = "[^#]#P[{]\([^}]*\)[}]";

But, as I mentioned above, the whole matached string, namely #P{x}, will be replaced once the match is found. So, the
character [^#] will also be replaced, that is not what I want.


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