]> Creatis software - creaBruker.git/commitdiff
Boost a un pb quand on essai de tester un match d'une expression reguliere un peu...
authorDenis Grenier <Denis.Grenier@creatis.insa-lyon.fr>
Tue, 26 Jan 2010 22:20:09 +0000 (22:20 +0000)
committerDenis Grenier <Denis.Grenier@creatis.insa-lyon.fr>
Tue, 26 Jan 2010 22:20:09 +0000 (22:20 +0000)
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

lib/src1/brukerdataset.cpp
lib/src1/brukerdataset.h

index cc305d7d02554f7a56280f55ff7a9ea902f7edc7..affe61c6eb68f0a7e9bf6912921b50fc5a878897 100644 (file)
@@ -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<char, char> 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<char, char> 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<std::string::const_iterator> 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<std::string::const_iterator> whatFloat;
+   if (!regex_search(start,end, whatFloat, isNotFloatSerie,flags))
+     return "float";
+   
+     // if not a float serie neither, it's a string !!!
+  return "string"; 
 }
 
 
index efb50ce8a0614a88b276fa4ffe105ecb65c78ac2..1056c111d82079510b13c3e452d7d505aac8b9a9 100644 (file)
@@ -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