Posix正则表达式API说明
1 头文件#include<regex.h> 2 基本方法2.1 regcomp
2.2 regexec
2.3 结构体regmatch_tregmatch_t 的定义如下 typedefstruct{ regoff_trm_so; regoff_trm_eo; }regmatch_t; 其中: 如果-1==rm_so,表示没有匹配到。 如果-1!=rm_so,表示string中下一个最大子字符串的偏移量 rm_eo表示子字符串的长度。 2.4 regerror
2.5 regfree
3 C++的简单封装可以使用C++进行简单的封装,使其更好用一些 //cregex.h #include<vector> #include<string> #include<regex.h> usingstd::string; usingstd::vector; classCStringMatch;//预先声明类 classCRegex { public: CRegex(conststring&sPattern,intcflags=REG_EXTENDED); virtual~CRegex(); stringGetErrMsg(); CStringMatchMatch(conststring&sStr,intcflags=0); boolinit(conststring&sPattern,intcflags=REG_EXTENDED); operatorbool()const{returnm_isValid;} private: regex_tm_regex; intm_cflags; boolm_isValid; intm_errcode; boolisRegMatchUsed(constregmatch_t&sRegMatch); }; classCStringMatch { public: CStringMatch(conststring&str):m_sStr(str){ } virtual~CStringMatch(){}; stringGetMatchContent(unsignedintindex){ returnstring(m_sStr.c_str()+m_vMatchPlaces[index].rm_so,m_sStr.c_str()+m_vMatchPlaces[index].rm_eo); } regmatch_tGetMatchPlace(unsignedintindex){ returnm_vMatchPlaces.at(index); } operatorbool()const{returnm_isValid;} private: stringm_sStr; friendCStringMatchCRegex::Match(conststring&sStr,intcflags); boolm_isValid; vector<regmatch_t>m_vMatchPlaces; }; //cregex.cpp #include"cregex.h" CRegex::CRegex(conststring&sPattern,intcflags) { init(sPattern,cflags); } boolCRegex::init(conststring&sPattern,intcflags) { memset(&m_regex,' ',sizeof(m_regex)); m_errcode=regcomp(&m_regex,sPattern.c_str(),cflags); if(m_errcode!=0) { m_isValid=false; } m_isValid=true; returnm_isValid; } CRegex::~CRegex() { regfree(&m_regex); } stringCRegex::GetErrMsg() { charszErrMsg[1024+1]=""; regerror(m_errcode,&m_regex,szErrMsg,sizeof(szErrMsg)); returnszErrMsg; } CStringMatchCRegex::Match(conststring&sStr,intcflags) { constunsignedintiMax=20; regmatch_tpResults[iMax]; memset(pResults,sizeof(pResults)); CStringMatchcMatchResult(sStr); m_errcode=regexec(&m_regex,sStr.c_str(),iMax,pResults,cflags); if(m_errcode==0) { cMatchResult.m_isValid=true; unsignedinti=0; for(i=0;i<iMax;++i){ if(isRegMatchUsed(pResults[i])) { cMatchResult.m_vMatchPlaces.push_back(pResults[i]); } } } else { cMatchResult.m_isValid=false; } returncMatchResult; } boolCRegex::isRegMatchUsed(constregmatch_t&sRegMatch) { returnsRegMatch.rm_so!=-1; } 这样使用时,只需要用正则字符串构造一个CRegex对象,并且它的match方法接收一个字符串作为匹配,并返回CStringMatch对象,使用CStringMatch对象的GetMatchContent方法获取捕获的内容 例如: CRegexcRegex("(.*)省(.+)市/县([^行]+(行股份有限公司|股份有限公司|行|社))(.*)"); if(cRegex) {CStringMatchcMatches=cRegex.Match(sBankName); if(cMatches) { sBankNameElements.province=cMatches.GetMatchContent(1); sBankNameElements.city=cMatches.GetMatchContent(2); sBankNameElements.bank=cMatches.GetMatchContent(3); sBankNameElements.keywords=cMatches.GetMatchContent(5); DEBUG_LOG("province=[%s],city=[%s],bank=[%s],keywords=[%s]",sBankNameElements.province.c_str(),sBankNameElements.city.c_str(),sBankNameElements.bank.c_str(),sBankNameElements.keywords.c_str()); returntrue; } else { Trace(L_DEBUG,__FILE__,__LINE__,NULL,cRegex.GetErrMsg().c_str()); } }else{ Trace(L_DEBUG,cRegex.GetErrMsg().c_str()); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |