boost::regex类为C++提供了完整的正则表达式支持,并且已被接收为C++0x标准库。
4.使用regex_iterator查找
对应于C字符串和C++字符串以及宽字符,
regex_iterator
同样也有四个特化:
typedef regex_iterator<const char*> cregex_iterator; typedef regex_iterator<std::string::const_iterator> sregex_iterator; typedef regex_iterator<const wchar_t*> wcregex_iterator; typedef regex_iterator<std::wstring::const_iterator> wsregex_iterator;
这个迭代器的
value_type
定义是一个
match_results
。
- {
- boost::regex reg( "//d+" );
- boost::cregex_iterator itrBegin(szStr, szStr+strlen(szStr), reg);
- boost::cregex_iterator itrEnd;
- for(boost::cregex_iterator itr=itrBegin; itr!=itrEnd; ++itr)
- {
-
- cout << (*itr)[0].first-szStr << ' ' << (*itr)[0].second-szStr << ' ' << *itr << endl;
- }
- }
{ //使用迭代器找出所有数字 boost::regex reg( "//d+" ); //查找字符串里的数字 boost::cregex_iterator itrBegin(szStr, szStr+strlen(szStr), reg); boost::cregex_iterator itrEnd; for(boost::cregex_iterator itr=itrBegin; itr!=itrEnd; ++itr) { // 指向子串对应首位置 指向子串对应尾位置 子串内容 cout << (*itr)[0].first-szStr << ' ' << (*itr)[0].second-szStr << ' ' << *itr << endl; } }
Boost.Regex也提供了
make_regex_iterator
函数简化
regex_iterator
的构造,如上面的
itrBegin
可以写成:
itrBegin = make_regex_iterator(szStr,reg);
5.使用regex_token_iterator拆分字符串
它同样也有四个特化,形式和上面类似,就不再写一遍骗篇幅了。
这个迭代器的
value_type
定义是一个
sub_match
。
- {
- boost::regex reg("/");
- boost::cregex_token_iterator itrBegin(szStr, szStr+strlen(szStr), reg,-1);
- boost::cregex_token_iterator itrEnd;
- for(boost::cregex_token_iterator itr=itrBegin; itr!=itrEnd; ++itr)
- {
- cout << *itr << endl;
- }
- }
{ //使用迭代器拆分字符串 boost::regex reg("/"); //按/符拆分字符串 boost::cregex_token_iterator itrBegin(szStr, szStr+strlen(szStr), reg,-1); boost::cregex_token_iterator itrEnd; for(boost::cregex_token_iterator itr=itrBegin; itr!=itrEnd; ++itr) { cout << *itr << endl; } }
Boost.Regex也提供了
make_regex_token_iterator
函数简化
regex_token_iterator
的构造,最后的那个参数
-1
表示以
reg
为分隔标志拆分字符串,如果不是-1则表示取第几个子串,并且可以使用数组来表示同时要取几个子串,例如:
- {
- boost::regex reg("(.)/(.)");
- int subs[] = {1,2};
- boost::cregex_token_iterator itrBegin = make_regex_token_iterator(szStr,reg,subs);
- boost::cregex_token_iterator itrEnd;
- for(boost::cregex_token_iterator itr=itrBegin; itr!=itrEnd; ++itr)
- {
- cout << *itr << endl;
- }
- }
{ //使用迭代器拆分字符串2 boost::regex reg("(.)/(.)"); //取/的前一字符和后一字符(这个字符串形象貌似有点邪恶-_-) int subs[] = {1,2}; // 第一子串和第二子串 boost::cregex_token_iterator itrBegin = make_regex_token_iterator(szStr,reg,subs); //使用-1参数时拆分,使用其它数字时表示取第几个子串,可使用数组取多个串 boost::cregex_token_iterator itrEnd; for(boost::cregex_token_iterator itr=itrBegin; itr!=itrEnd; ++itr) { cout << *itr << endl; } }
参考 正则表达式教程
联机文档 联机文档里几个不错的例子: regex_search示例
,演示找出C++代码中所有的类定义
regex_replace示例
,演示以C/C++代码作为输入,输出代码高亮的HTML代码
regex_iterator示例
,regex_search示例的regex_iterator实现
regex_token_iterator示例
,第二个例子演示了从一个HTML文件里提取出所的有链接地址