关于greta正则表达式的使用

VC可以使用的正则表达式我知道的有:ATL CAtlRegExp,GRETA,Boost::regex 等正则表达式库,这些表达式库使我们可以方便地利用正则库的巨大威力,给我们的工作提供了便利。
这种些正则表达式各自有自己的优点,但我最终还是选择了使用GRETA正则表达式,因为ATL CAtlRegExp速度相比较有些慢,而Boost库我目前还不会使用.GRETA相比较Boost是轻量级的,而且也是转门用来处理正则表达式的.速度也是最快的.

但是目前在网上有关GRETA库使用的文档真是少之有少,由于此库是完全天源的,所以下载下来以后只有6个源文件,使用这些源文件可以两种方法,1:只接添加它们到你的工程.2:编译成为静态库.第1种方式不是太好,会使你的工程里有过多的类而显得不清晰.在网上可以找到一些已经编译好的Lib库,最好不要使用,因为Lib库和你工程的run-time library不一样,会导致链接错误.所以最好自己生成和工程同样的run-time library.

使用时只需要包含regexpr2.h即可,有关正则表达式的语法可以参见其它方档.

我们只需要关注GRETA的的几个对象即可,它们是:

  1. rpattern : 搜索的模式
  2. match_results : 放置匹配的容器
  3. subst_results : 放置替换的容器
  4. split_results : 放置分离的窗口(此接口的使用方法不是很清楚)

使用方法参见下面的实例:

void  CPrepareHtml::FindLable(CString strContant)
{
    rpattern pattern(
"/[LABEL +id *= *"([0-9A-Za-z_-]+)" */]",GLOBAL|NOCASE|ALLBACKREFS);
    match_results results;
    match_results::backref_type br 
= pattern.match((LPCTSTR)strContant,results);
//    match_results::backref_vector backVec = results.all_backrefs();

    IXMLDOMDocument2Ptr pDoc;
    IXMLDOMElementPtr pElem;
    HRESULT hr 
= pDoc.CreateInstance(__uuidof(DOMDocument));
    
if (SUCCEEDED(hr))
    
{
        pElem 
= pDoc->createElement("LABELS");
        pElem 
= pDoc->appendChild(pElem);

        
for (int iter = 1;iter < results.cbackrefs();iter += 2// 目前还没有找到读取子表达式更好的方法
        {
            match_results::backref_type br_Temp 
= results.backref(iter);
            std::
string strValue = br_Temp.str();

            IXMLDOMElementPtr pElemLable 
= pDoc->createElement("LABEL");
            pElemLable 
= pElem->appendChild(pElemLable);
            pElemLable
->Puttext(strValue.c_str()); // 匹配到的字符串生成XML结点
        }

        
/*
        for (int iter = 1;iter < backVec.size();iter += 2)
        {
            match_results::backref_type br_Temp = backVec[iter];
            std::string strValue = br_Temp.str();

            IXMLDOMElementPtr pElemLable = pDoc->createElement("LABEL");
            pElemLable = pElem->appendChild(pElemLable);
            pElemLable->Puttext(strValue.c_str());
        }
        
*/

    }


    
static const rpattern patsubst("/[APP +id *= *"HTMLROOT *" */]","C://whiz",GLOBAL|NOCASE); // 第二个参数是表达式语法
    subst_results subResults;
    std::
string sContant(strContant);
    
int nSub = patsubst.substitute(sContant,subResults);
    sContant 
= ReplaceLable(pDoc,sContant);
    WriteHTMLFile(
"C:/temp/tempHTML.html",sContant.c_str(),sContant.length());
}


std::
string  CPrepareHtml::ReplaceLable(IXMLDOMDocument2Ptr &  pDoc,std:: string  strContant)
{
    CString strPattern;
    IXMLDOMNodePtr pLable 
= NULL;
    IXMLDOMNodeListPtr pLableList 
= pDoc->selectNodes("/LABELS/LABEL"); // 读取XML结点
    while (pLable = pLableList->nextNode())
    
{
        CString strLable 
= (BSTR)pLable->Gettext();
        CString strValue 
= m_IniDic[strLable];
        strPattern.Format(
"/[LABEL *id="%s" */]",strLable);
        strContant 
= ReplaceTag(strPattern,strValue,strContant);
    }

    
return strContant;
}


std::
string  CPrepareHtml::ReplaceTag(LPCTSTR pattern,LPCTSTR value,std:: string &  Contant)
{
    rpattern patsubst(pattern,value,GLOBAL
|NOCASE);
    subst_results subResults;
    
int nSub = patsubst.substitute(Contant,subResults); // 替换
    return Contant;
}

以上的这些是经过我一上午的研究,关于split_results 还不会使用,希望有人指点.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值