From: Denis Grenier Date: Tue, 26 Jan 2010 22:20:09 +0000 (+0000) Subject: Boost a un pb quand on essai de tester un match d'une expression reguliere un peu... X-Git-Tag: CREATOOLS.2-0-3~23 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?p=creaBruker.git;a=commitdiff_plain;h=ae5c3dd3e9ff2d97d7c4dba31680ad97be1f967a Boost a un pb quand on essai de tester un match d'une expression reguliere un peu trop laxe sur une grande chaine de characteres. plutot que de vouloir verifier si une chaine est composee d'entier, de floats ou d'un string en utilisant regexp_match() il vaut mieux essayer de trouver des caracteres qui prouvent que ce ne sont pas des entiers, des floats, donc des strings en utilisant regexp_search(). j'ai en plus rajoute une methode pour virer les newline et eventuellement les espaces. Denis Grenier --- diff --git a/lib/src1/brukerdataset.cpp b/lib/src1/brukerdataset.cpp index cc305d7..affe61c 100644 --- a/lib/src1/brukerdataset.cpp +++ b/lib/src1/brukerdataset.cpp @@ -67,11 +67,42 @@ bool BrukerDataSet::BoolMatchBufferForText(std::string& file, const boost::regex { boost::cmatch what; if (regex_match(file.c_str(), what, RegExp)) - return true; + return true; return false; } +std::string BrukerDataSet::RemoveNewlines(std::string file) +{ + boost::regex regexNewline; + const char* pre_expression = "[[:cntrl:]]"; + regexNewline.assign(pre_expression); + + const char* pre_format = ""; + std::ostringstream t(std::ios::out | std::ios::binary); + std::ostream_iterator oi(t); + boost::regex_replace(oi, file.begin(), file.end(), + regexNewline, pre_format, boost::match_default | boost::format_all); + std::string s(t.str()); + return s; + } + +std::string BrukerDataSet::RemoveSpaces(std::string file) +{ + boost::regex regexSpace; + const char* pre_expression = "[[:space:]]"; + regexSpace.assign(pre_expression); + const char* pre_format = ""; + std::ostringstream t(std::ios::out | std::ios::binary); + std::ostream_iterator oi(t); + boost::regex_replace(oi, file.begin(), file.end(), + regexSpace, pre_format, boost::match_default | boost::format_all); + std::string s(t.str()); + return s; + } + + + std::string BrukerDataSet::MatchBufferForText(std::string& file,const boost::regex& RegExp) { @@ -144,21 +175,37 @@ std::string BrukerDataSet::GetValuesPart(std::string& file) { std::string Result; Result=MatchBufferForText(file,BufferNValues); - if (Result !="") - return Result; + if (Result !="") + return RemoveNewlines(Result); return MatchBufferForText(file,Buffer1Value); } std::string BrukerDataSet::GetContentType(std::string& file) { - std::string ValuesPart, Result; + std::string ValuesPart; + boost::match_flag_type flags = boost::match_default; + std::string::const_iterator start, end; ValuesPart=GetValuesPart(file); - if (BoolMatchBufferForText(ValuesPart,IntSeries)) - return "int"; - if (BoolMatchBufferForText(ValuesPart,FloatSeries)) - return "float"; - return "string"; + start=ValuesPart.begin(); + end=ValuesPart.end(); + // boost regexp_match can not handle well what we want + // so instead of looking for a match we will seek proof of a non int serie + // i.e. check if we can find something else than than -0-9 + boost::regex isNotIntSerie("[^ \\-0-9]"); + boost::match_results whatInt; + if (!regex_search(start,end, whatInt, isNotIntSerie,flags)) + return "int"; + + // if not int serie check if it's not a floats serie !!! + + boost::regex isNotFloatSerie("[^ \\-\\+\\.eE0-9]"); + boost::match_results whatFloat; + if (!regex_search(start,end, whatFloat, isNotFloatSerie,flags)) + return "float"; + + // if not a float serie neither, it's a string !!! + return "string"; } diff --git a/lib/src1/brukerdataset.h b/lib/src1/brukerdataset.h index efb50ce..1056c11 100644 --- a/lib/src1/brukerdataset.h +++ b/lib/src1/brukerdataset.h @@ -95,6 +95,8 @@ private: std::string GetTextValueN (std::string &kw, int n); bool CheckExistKeyword (std::string &kw); bool CheckExistKeyword (const char *kw); + std::string RemoveNewlines(std::string); + std::string RemoveSpaces(std::string); //BrukMapType