在c++Builder中使用boost正则表达式实现的查找double和int类型的字符串,并实现StringToInteger和StringToDouble函数

来源:互联网 发布:软件项目管理 考试 编辑:程序博客网 时间:2024/05/29 05:07

直接贴出来代码,以供参考:

// -以下为头文件定义#include"StringToNumber.h"

#include<boost/regex.hpp>//正则表达式的头文件

// #include<vector>//其实上面的代码会自动包含此头文件
// #include<string> //其实上面的代码会自动包含此头文件
// ---------------------------------------------------------------------------
// ==============================================================================
// 为标准C++库<std::string>服务
// ==============================================================================

Cpp代码 复制代码
  1. std::vector<std::string>FindDoubleString(std::string &Inputstring) {   
  2.  std::vector<std::string>Outputstring;   
  3.  std::string regstr =   
  4.  "([-|+]?//d+//.//d+[e|E][+|-]//d+|[-|+]?//.//d+[e|E][+|-]//d+|[-|+]?//d+//.//d{0,}|[-|+]?//d+|[-|+]?//.//d+)";   
  5.  boost::regex expression(regstr);   
  6.  boost::smatch what;   
  7.  std::string::const_iterator start = Inputstring.begin();   
  8.  std::string::const_iterator end = Inputstring.end();   
  9.  while (boost::regex_search(start, end, what, expression)) {   
  10.   std::string msg(what[1].first, what[1].second); // 提取匹配字符  
  11.   Outputstring.push_back(msg); // 将匹配结果放在vs中  
  12.   start = what[0].second; // 从此位置再次搜索   
  13.  };   
  14.  return Outputstring;   
  15. };  


// ==============================================================================
// UnicodeString For C++ Builder
// ==============================================================================

Cpp代码 复制代码
  1. std::vector<String>FindDoubleString(String &InputString) {   
  2.  std::string Inputstring = InputString.t_str();   
  3.  std::vector<String>OutputString;   
  4.  std::string regstr =   
  5.  "([-|+]?//d+//.//d+[e|E][+|-]//d+|[-|+]?//.//d+[e|E][+|-]//d+|[-|+]?//d+//.//d{0,}|[-|+]?//d+|[-|+]?//.//d+)";   
  6.  boost::regex expression(regstr);   
  7.  boost::smatch what;   
  8.  std::string::const_iterator start = Inputstring.begin();   
  9.  std::string::const_iterator end = Inputstring.end();   
  10.  while (boost::regex_search(start, end, what, expression)) {   
  11.   std::string msg(what[1].first, what[1].second); // 提取匹配字符  
  12.   OutputString.push_back(msg.c_str()); // 将匹配结果放在vs中  
  13.   start = what[0].second; // 从此位置再次搜索   
  14.  };   
  15.  return OutputString;   
  16. };  


//////////////////////////////////////////////////////////////////////////
////1.StringToDouble
//////////////////////////////////////////////////////////////////////////

Cpp代码 复制代码
  1. bool StringToDouble(String Str, double &dbl) {   
  2.  bool IsValid = false;   
  3.  std::vector<String>OutputString = FindDoubleString(Str);   
  4.  if (OutputString.size() > 0) {   
  5.   dbl = OutputString[0].ToDouble();   
  6.   IsValid = true;   
  7.  }   
  8.  return IsValid;   
  9. };  


// ==============================================================================
// 在string中查找整数integer
// ==============================================================================

Cpp代码 复制代码
  1. std::vector<std::string>FindIntegerString(std::string &Inputstring) {   
  2.  std::vector<std::string>Outputstring;   
  3.  std::string regstr = "([-|/+]?//d{1,10})";   
  4.   
  5.  boost::regex expression(regstr);   
  6.  boost::smatch what;   
  7.  std::string::const_iterator start = Inputstring.begin();   
  8.  std::string::const_iterator end = Inputstring.end();   
  9.  while (boost::regex_search(start, end, what, expression)) {   
  10.   std::string msg(what[1].first, what[1].second); // 提取匹配字符  
  11.   Outputstring.push_back(msg); // 将匹配结果放在vs中  
  12.   start = what[0].second; // 从此位置再次搜索   
  13.  };   
  14.  return Outputstring;   
  15. };  


// ==============================================================================
// UnicodeString For C++ Builder 在String中查找整数integer
// ==============================================================================

Cpp代码 复制代码
  1. std::vector<String>FindIntegerString(String &InputString) {   
  2.  std::string Inputstring = InputString.t_str();   
  3.  std::vector<String>OutputString;   
  4.  std::string regstr = "([-|/+]?//d{1,10})";   
  5.  boost::regex expression(regstr);   
  6.  boost::smatch what;   
  7.  std::string::const_iterator start = Inputstring.begin();   
  8.  std::string::const_iterator end = Inputstring.end();   
  9.  while (boost::regex_search(start, end, what, expression)) {   
  10.   std::string msg(what[1].first, what[1].second); // 提取匹配字符  
  11.   OutputString.push_back(msg.c_str()); // 将匹配结果放在vs中  
  12.   start = what[0].second; // 从此位置再次搜索   
  13.  };   
  14.  return OutputString;   
  15. };  


// ==============================================================================
// StringToInteger 如果返回值为真,则Int被正确赋值
// ==============================================================================

Cpp代码 复制代码
  1. //////////////////////////////////////////////////////////////////////////  
  2. ////1.StringToInteger   
  3. //////////////////////////////////////////////////////////////////////////  
  4. bool StringToInteger(String Str, int &Int) {   
  5.  bool IsValid = false;   
  6.  std::vector<String>OutputString = FindIntegerString(Str);   
  7.  if (OutputString.size() > 0) {   
  8.   Int = OutputString[0].ToInt();   
  9.   IsValid = true;   
  10.  }   
  11.  return IsValid;   
  12. };   
  13. //////////////////////////////////////////////////////////////////////////  


// -以上为头文件定义#include"StringToNumber.h"
//==============================================================================
// 以下为测试程序
//==============================================================================
//

Cpp代码 复制代码
  1. #include <vcl.h>   
  2. #pragma hdrstop   
  3.   
  4. #include <tchar.h>   
  5. // ---------------------------------------------------------------------------  
  6. #include<iostream>   
  7. #include"StringToNumber.h"   
  8. // using namespace std;   
  9. // using namespace boost;   
  10. // ---------------------------------------------------------------------------  
  11.   
  12. #pragma argsused   
  13.   
  14. // ---------------------------------------------------------------------------  
  15.   
  16. int _tmain(int argc, _TCHAR* argv[]) {   
  17.  try {   
  18.   std::string teststring = " -192.0+16.0a8.4hg93.sfe..e9.2s1+1.23e+3";   
  19.   std::vector<std::string>vstr;   
  20.   vstr = FindDoubleString(teststring);   
  21.   std::cout << "teststring" << std::endl;   
  22.   std::cout << teststring << std::endl;   
  23.   std::cout << "vstr" << std::endl;   
  24.   for (unsigned i = 0; i < vstr.size(); i++) {   
  25.    std::cout << "<" << vstr[i] << ">";   
  26.   }   
  27.    std::cout <<std::endl;   
  28.     // ==============================================================================  
  29.   // UnicodeString   
  30.   // ==============================================================================  
  31.   String testString = "  -192.0+16.0a8.4hg93.sfe..e9.2s1+1.23e+3";   
  32.   std::vector<String>VStr;   
  33.   VStr = FindDoubleString(testString);   
  34.   std::cout << "testString" << std::endl;   
  35.   std::cout << testString.t_str() << std::endl;   
  36.   std::cout << "vstr" << std::endl;   
  37.   for (unsigned i = 0; i < VStr.size(); i++) {   
  38.    std::cout << "<" << VStr[i].t_str() << ">";   
  39.   }   
  40.     std::cout <<std::endl;   
  41.   // ==============================================================================  
  42.   // 测试StringToDouble   
  43.   // ==============================================================================  
  44.   double d = 0;   
  45.   String dStr = "  3498203.38403";   
  46.   // StringToDouble();   
  47.   if (StringToDouble(dStr, d)) {   
  48.    std::cout << "成功d= " << d << std::endl;   
  49.   }   
  50.   else {   
  51.    std::cout << "转换失败" << std::endl;   
  52.   }   
  53.     std::cout <<std::endl;   
  54.   // ==============================================================================  
  55.   // 在string中查找整数integer   
  56.   // ==============================================================================  
  57.   teststring = "  -192.0+16.0a8.4hg93.sfe..e9.2s1+1.23e+3";   
  58.   vstr = FindIntegerString(teststring);   
  59.   std::cout << "teststring" << std::endl;   
  60.   std::cout << teststring << std::endl;   
  61.   std::cout << "vstr" << std::endl;   
  62.   for (unsigned i = 0; i < vstr.size(); i++) {   
  63.    std::cout << "<" << vstr[i] << ">";   
  64.   }   
  65.   // ---------------------------------------------------------------------------  
  66.   // ==============================================================================  
  67.   // 测试StringToInteger   
  68.   // ==============================================================================  
  69.   int i = 0;   
  70.   String iStr = "  3498203.38403";   
  71.     std::cout <<std::endl;   
  72.   if (StringToInteger(iStr, i)) {   
  73.    std::cout << "成功i= " <<i << std::endl;   
  74.   }   
  75.   else {   
  76.    std::cout << "转换失败" << std::endl;   
  77.   }   
  78.   
  79.   // ---------------------------------------------------------------------------  
  80.   std::getchar();   
  81.  }   
  82.  catch(...) {   
  83.   
  84.  }   
  85.   
  86.  return 0;   
  87. }   

 

原创粉丝点击