天天看點

vc6.0下 使用boost regex正規表達式比對帶中文的任意字元

源代碼:

boost::cmatch result2;

// 特殊字元"."和"\"從字元串轉為正規表達式需要加"\",在正規表達式中要單純的表示反斜杠字元頁需要加"\",是以要比對".\ "應該寫為"\\.\\\\"

 CString csReg = "\\.\\\\(\\S+)\\.[tsp|enx|ts|tc|tsw]";  // 比對 以  .\  開頭 .tsp|.enx|.ts|.tc|.tsw 結尾的任意字元串,并擷取比對到的字元串

 boost::regex regText;

 regText = csReg;

 string sToMatch((LPCTSTR)csSourceStr);

 if ( !boost::regex_search(sToMatch,result2,regText))

 {

  return FALSE;

  }

  //下标從1開始, result2[0] 不正确

 for (size_t i = 1; i < result2.size(); ++i)  

 {         

  if (result2[i].matched)

   {

   std::string strIs(result2[i].first,result2[i].second);

   csDestStr = strIs.c_str();

  }

 }

 return TRUE;

測試代碼未進行寬字元轉換:

BOOL CSelectTestInstance::regexMatchStr(const CString &csSourceStr,CString &csDestStr)

{

 boost::cmatch result2;

 boost::regex regText("[A-Za-z0-9_\x80-\xFF]+");//如果比對的字元串為./硬測自動化/自動化.tc ,比對的結果隻能比對到“硬測自動化”,不知為何

 string sToMatch((LPCTSTR)csSourceStr);//csSourceStr = ./硬測自動化_A_1.tc

 if ( !boost::regex_search(sToMatch,result2,regText))

 {

     return FALSE;

  }

 for (size_t i = 0; i < result2.size(); ++i)  

 {         

  if (result2[i].matched)

   {

   std::string strIs(result2[i].first,result2[i].second);

   csDestStr = strIs.c_str();

   }

 }

 return TRUE;

}