vs2008 C++定则表达式

正则表达式语言 - 快速参考

vs2008 regex库有regex_match函数regex_search 函数

regex_replace 函数regex_iterator 类regex_token_iterator 类
/**********************cmatch*************************************/
typedef basic_regex<char> regex;
typedef basic_regex<wchar_t> wregex;
typedef match_results<const char*> cmatch;//保存子匹配序列。
typedef match_results<const wchar_t*> wcmatch;
//match_results str()函数定义
std::basic_string<value_type> str() const
	{	// convert matched text to string
	return (matched ?
		std::basic_string<value_type>(this->first, this->second)
		: std::basic_string<value_type>());
	}



可以把match_results看成是一个sub_match的容器,同时它还提供了format方法来代替regex_format函数。
一个sub_match就是一个子串,它从std::pair<BidiIterator, BidiIterator>继承而来,这个迭代器pair里的first和second分别指
向了这个子串开始和结尾所在位置。
//match_results.str.c_str();获取匹配子字符串
//regex_match()只有在整个字符串匹配正则表达式时才返回 true, 而 regex_search()在子串匹配就返回 true.
/***************************regex_match函数***********************************/
要确定一行字符串是否与指定的正则表达式匹配,使用regex_match
const std::string m_strSource("<name>aa</name> <name>12</name> <name>ac</name>");
const std::string m_strReg("<name>[a-zA-Z]+</name>");
//std::tr1::cmatch m_match;
std::tr1::regex_constants::match_flag_type m_flag = 
std::tr1::regex_constants::match_default;
std::tr1::regex m_reg("([0-9A-Za-z\-_\.]+)@([0-9a-z]+\.[a-z]{2,3}(\.[a-z]{2})?)"); 
bool m_bMatch= std::tr1::regex_match("12345@qq.com",m_reg);


查找字符串
regex_match只验证是否完全匹配,如果想从一大串字符串里找出匹配的一小段字符串(比如从网页文件里找超链接),这时就要使
用regex_search了
/****************************regex_search函数*********************************************/
std::wstring m_strSource(L"<name>aa</name> <name>12</name> <name>ac</name>");
std::wstring m_Pattern(L"<name>[a-zA-Z]+</name>");
std::tr1::wregex m_RegExp(m_Pattern);
std::tr1::wsmatch m_match;
//iterator
std::wstring::const_iterator it = m_strSource.begin();
std::wstring::const_iterator end = m_strSource.end();


bool bMatched = std::tr1::regex_search(it, end, m_match, m_RegExp);
while (bMatched)
{
std::wstring sLink = m_match.str().c_str();
std::wcout<<sName;
it = m_match[0].second;
end = m_strSource.end();
bMatched = std::tr1::regex_search(it, end, m_match,m_RegExp);
}

regex_replace提供了简便的方法来部分替换源字符串,好像没有宽字节的重载,那就用多字节的吧
/******************************regex_replace*************************************/
const std::string m_strSource("<name>aa</name> <name>12</name> <name>bb</name>");
const std::string m_strReg("<name>[a-zA-Z]+</name>");
std::tr1::regex m_reg(m_strReg);
string str = std::tr1::regex_replace( m_strSource, m_reg, (std::string)"<NAME>cc</NAME>");
//结果:"<NAME>cc</NAME> <name>12</name> <NAME>cc</NAME>"
std::tr1::regex_constants::match_flag_type fonly = 
std::tr1::regex_constants::format_first_only;
string str = std::tr1::regex_replace( m_strSource, m_reg, (std::string)"<NAME>cc</NAME>",fonly);
//<NAME>cc</NAME> <name>12</name> <name>bb</name>
//使用regex_iterator查找
/*********************regex_iterator**********************************/
//typedef regex_iterator<const char*> cregex_iterator;
//typedef regex_iterator<const wchar_t*> wcregex_iterator;
wchar_t* buffer= L"<name>aa</name> <name>12</name> <name>ac</name>";
const std::wstring m_wpattern(L"<name>[a-zA-Z]+</name>");
std::tr1::wregex m_wReg(m_wstrReg);


std::tr1::wcregex_iterator it(buffer,buffer+wcslen(buffer),m_wReg) , end;
while(it!=end)
{
std::wcout<<it->str().c_str()<<std::endl;
++it;
} 


/*****************regex_token_iterator 迭代器*****************************/
wchar_t* buffer = L"<name>aa</name> <name>12</name> <name>ac</name>";
const std::wstring m_wpattern(L"<name>[a-zA-Z]+</name>");
//match type
std::tr1::regex_constants::match_flag_type m_flag = 
std::tr1::regex_constants::match_default;
//compile regex finite auto-machine
std::tr1::wregex m_wReg(m_wpattern);
//typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;  
std::wstring m_wstr(buffer);
std::tr1::wsregex_token_iterator  it(m_wstr.begin(), m_wstr.end(), m_wReg) ,end;
for ( ; it != end; ++it)  
{  
outVec.push_back(it->str().c_str());  
}   



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值