VC6下正则greta库的测试和使用手记
2009-05-22 20:06:09 来源:WEB开发网另外,如果仍遇到11个左右的莫名其妙错误时,可以把MFC设置为静态链接模式,我刚开始时候就遇到了这个问题,搞了半天不知道什么原因,后来就改了静态选项;不过写本文时,本来想看看这个错误是什么,好给大家贴出来,把MFC改回共享链接又正常了...那些错误就是搞不出来(bt...)
4)环境设置好,下面就可以使用了;
几个重要的对象:
rpattern--正则模式及设置,主要就用它;
match_results--匹配结果容器;
subst_results--替换结果容器;
split_results--分割结果容器;
基本主要的就这几个了,具体用法,贴代码,大家自己看;
图片看不清楚?请点击这里查看原图(大图)。
//////////////////////////////////
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);
}
/////----------结束-----------////////
以上为初步测试结果,可能在使用和介绍中有错误和不当之初,欢迎大家多交流探讨。
更多精彩
赞助商链接