WEB开发网
开发学院软件开发VC VC6下正则greta库的测试和使用手记 阅读

VC6下正则greta库的测试和使用手记

 2009-05-22 20:06:09 来源:WEB开发网   
核心提示: 另外,如果仍遇到11个左右的莫名其妙错误时,VC6下正则greta库的测试和使用手记(2),可以把MFC设置为静态链接模式,我刚开始时候就遇到了这个问题,任选一种方式即可{match_results::backref_vector vec = result.all_backrefs();

另外,如果仍遇到11个左右的莫名其妙错误时,可以把MFC设置为静态链接模式,我刚开始时候就遇到了这个问题,搞了半天不知道什么原因,后来就改了静态选项;不过写本文时,本来想看看这个错误是什么,好给大家贴出来,把MFC改回共享链接又正常了...那些错误就是搞不出来(bt...)

4)环境设置好,下面就可以使用了;

几个重要的对象:

rpattern--正则模式及设置,主要就用它;

match_results--匹配结果容器;

subst_results--替换结果容器;

split_results--分割结果容器;

基本主要的就这几个了,具体用法,贴代码,大家自己看;

VC6下正则greta库的测试和使用手记

图片看不清楚?请点击这里查看原图(大图)。

//////////////////////////////////

 if( nChar==VK_ESCAPE )
  CDialog::OnOK();
 else if( nChar==VK_F5 ) //匹配查找
 {
  UpdateData();
  m_strResult = "";
  match_results result;
  REGEX_FLAGS dw = GLOBAL | ALLBACKREFS;
  if( m_bCase ) dw |= NOCASE;
  if( m_bMulti ) dw |= MULTILINE;
  if( m_bSingle ) dw |= SINGLELINE;
  //
  double tmS = clock();
  //
  rpattern pat((LPCTSTR)m_strReg, dw);
  int iGroups = pat.cgroups();
  int nCount = 0;
  match_results::backref_type br = pat.match( (LPCTSTR)m_strSource, result );
  if( 0 )//遍历结果方式1,任选一种方式即可
  {
   match_results::backref_vector vec = result.all_backrefs();
   match_results::backref_vector::iterator iter;
   if( br.matched )
   {
    for( iter = vec.begin(); iter != vec.end(); iter++ )
    {
     nCount++;
     string str = (*iter).str();
     m_strResult += str.c_str();
     m_strResult += "rn---------------------------------------------rn";
    }
   }
  }
  if( 1 )//遍历结果方式2
  {
   if( br.matched )
   {
    for( int i=0;i<result.cbackrefs();i++ )
    {
     if( i%iGroups == 0 )
     {
      nCount++;
      m_strResult += result.backref(i).str().c_str();
      m_strResult += "rn---------------------------------------------rn";
     }
    }
   }
  }
  double tmE = clock();
  CString strTip;
  strTip.Format(_T("  运行时间 %.2fms, 共找到 %d个匹配;"), double(tmE-tmS), nCount);
  GetDlgItem(IDC_STATIC_TIP)->SetWindowText(strTip);
  //
  UpdateData(FALSE);
 }
 else if( nChar == VK_F6 )//替换
 {
  UpdateData();
  m_strResult = "";
  //
  REGEX_FLAGS dw = GLOBAL | ALLBACKREFS;
  if( m_bCase ) dw |= NOCASE;
  if( m_bMulti ) dw |= MULTILINE;
  if( m_bSingle ) dw |= SINGLELINE;
  double tmS = clock();
  //
  rpattern pat((LPCTSTR)m_strReg, (LPCTSTR)m_strSub, dw);
  subst_results subResult;
  //
  string str((LPCTSTR)m_strSource);
  int nCount = pat.substitute(str, subResult);
  m_strResult = str.c_str();
  //
  double tmE = clock();
  CString strTip;
  strTip.Format(_T("  运行时间 %.2fms, 共完成替换 %d处;"), double(tmE-tmS), nCount);
  GetDlgItem(IDC_STATIC_TIP)->SetWindowText(strTip);
  //
  UpdateData(FALSE);
 }
 else if( nChar == VK_F7 )//分割字符串
 {
  UpdateData();
  m_strResult = "";
  //
  REGEX_FLAGS dw = GLOBAL | ALLBACKREFS;
  if( m_bCase ) dw |= NOCASE;
  if( m_bMulti ) dw |= MULTILINE;
  if( m_bSingle ) dw |= SINGLELINE;
  double tmS = clock();
  //
  rpattern pat((LPCTSTR)m_strReg, dw);
  split_results splitResult;
  //
  string str((LPCTSTR)m_strSource);
  int nCount = pat.split(str, splitResult);
  for( int ni=0;ni<nCount;ni++ )
  {
   string strSplit = splitResult[ni];
   m_strResult += strSplit.c_str();
   m_strResult += "rn---------------------------------------------rn";
  }
  //
  double tmE = clock();
  CString strTip;
  strTip.Format(_T("  运行时间 %.2fms, 共找到 %d个匹配;"), double(tmE-tmS), nCount);
  GetDlgItem(IDC_STATIC_TIP)->SetWindowText(strTip);
  //
  UpdateData(FALSE);
 }

/////----------结束-----------////////

以上为初步测试结果,可能在使用和介绍中有错误和不当之初,欢迎大家多交流探讨。

上一页  1 2 

Tags:VC 正则 greta

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接