标 题: C++ 提取网页内容系列之四
作 者: itdef
链 接: http://www.cnblogs.com/itdef/p/4173833.html

欢迎转帖 请保持文本完整并注明出处

将网页内容下载后存入字符串string 或者本地文件后 我们开始进行搜索和查询 获取信息
这里使用正则式  使用vs2008  其自带的tr1库(预备标准库) 有正则式库供使用
带头文件/*******************************************************************************
*  @file        
*  @author      def< qq group: 324164944 >
*  @blog        http://www.cnblogs.com/itdef/
*  @brief     
/*******************************************************************************/
#include <regex>
using namespace std::tr1;
using namespace std;

这里推荐正则式教程
正则表达式30分钟入门教程
http://www.cnblogs.com/deerchao/ ... zhongjiaocheng.html

C++:Regex正则表达式
http://blog.sina.com.cn/s/blog_ac9fdc0b0101oow9.html

首先来个简单例子

#include <string>
#include <iostream>
#include <regex> using namespace std::tr1;
using namespace std; string strContent = " onclick=\"VeryCD.TrackEvent('base', '首页大推', '神雕侠侣');"; void Test1()
{
string strText = strContent;
string strRegex = "首页大推";
regex regExpress(strRegex); smatch ms; cout << "*****************************" << endl;
cout << "Test 1" << endl << endl; while(regex_search(strText, ms, regExpress))
{
for(string::size_type i = ;i < ms.size();++i)
{
cout << ms.str(i).c_str() << endl;
}
strText = ms.suffix().str();
} cout << "*****************************" << endl << endl;
} void Test2()
{
string strText = strContent;
string strRegex = "首页大推.*'(.*)'";
regex regExpress(strRegex); smatch ms; cout << "*****************************" << endl;
cout << "Test 2" << endl << endl;
while(regex_search(strText, ms, regExpress))
{
for(string::size_type i = ;i < ms.size();++i)
{
cout << ms.str(i).c_str() << endl;
}
strText = ms.suffix().str();
}
cout << "*****************************" << endl << endl;
} int _tmain(int argc, _TCHAR* argv[])
{
Test1();
Test2(); return ;
}

Test1中 我们等于是直接搜索字符串 然后 打印出找到的位置Test2中 我们使用 首页大推.*'(.*)'  
.号等于是任意非空白换行字符 *则代表重复任意多次(0-无穷次)
而括号表示一个字符集 也就是我们需要查找的内容 
请注意这个括号是在 ' '  之间的  也就是查找 首页大推 任意字符之后 两个 '  '号之间的内容

效果如下:
而且我们也发现 ms的显示规律 他首先显示符合条件的字符串 然后现实符合( )里面条件的子字符串

下面来个深入点得  分析这个字符串
string strContent0 = "alt=\"火影忍者\" /><div class=\"play_ico_middle\"></div><div class=\"cv-title\" style=\"width:85px;\">更新至612集</div>";

我们使用的正则式规则为 string strRegex = "alt=\"([^\"]*)\".*width:85px;\">(.*)</div>";
注意里面有两个括号  一个是在alt= 之后 在两个" " 之间的内容  一个是在width:85px;\">  和 </div> 之间的内容 
注意  "的显示 由于C++语言的特性 必须写成 \"
现在分析两个括号内容 ([^\"]*)     (.*)

(.*)无须多说  就是任意非空白字符 而且是在width:85px;\">  和 </div> 之间的内容 
([^\"]*)  就是说 非"的内容任意重复多次  而且这个括号是在alt= 之后 在两个" " 之间的内容

运行结果如下:(为了不显示过多内容 符合条件的内容没有全部显示 只显示了符合括号需求的子字符串)

/*******************************************************************************
* @file
* @author def< qq group: 324164944 >
* @blog http://www.cnblogs.com/itdef/
* @brief
/*******************************************************************************/ #include <string>
#include <iostream>
#include <regex> using namespace std::tr1;
using namespace std; string strContent = " onclick=\"VeryCD.TrackEvent('base', '首页大推', '神雕侠侣');"; string strContent0 = "alt=\"火影忍者\" /><div class=\"play_ico_middle\"></div><div class=\"cv-title\" style=\"width:85px;\">更新至612集</div>"; void Test1()
{
string strText = strContent;
string strRegex = "首页大推";
regex regExpress(strRegex); smatch ms; cout << "*****************************" << endl;
cout << "Test 1" << endl << endl; while(regex_search(strText, ms, regExpress))
{
for(string::size_type i = ;i < ms.size();++i)
{
cout << ms.str(i).c_str() << endl;
}
strText = ms.suffix().str();
} cout << "*****************************" << endl << endl;
} void Test2()
{
string strText = strContent;
string strRegex = "首页大推.*'(.*)'";
regex regExpress(strRegex); smatch ms; cout << "*****************************" << endl;
cout << "Test 2" << endl << endl;
while(regex_search(strText, ms, regExpress))
{
for(string::size_type i = ;i < ms.size();++i)
{
cout << ms.str(i).c_str() << endl;
}
strText = ms.suffix().str();
}
cout << "*****************************" << endl << endl;
} void Test3()
{
string strText = strContent0;
string strRegex = "alt=\"([^\"]*)\".*width:85px;\">(.*)</div>";
regex regExpress(strRegex); smatch ms; cout << "*****************************" << endl;
cout << "Test 3" << endl << endl; while(regex_search(strText, ms, regExpress))
{
for(string::size_type i = ;i < ms.size();++i)
{
if(i > )
cout << ms.str(i).c_str() << endl;
}
strText = ms.suffix().str();
}
cout << "*****************************" << endl << endl; } int _tmain(int argc, _TCHAR* argv[])
{
Test1();
Test2();
Test3(); return ;
}

最新文章

  1. 从Undo,Redo谈命令模式
  2. 如何在 Ubuntu Linux 16.04上安装开源的 Discourse 论坛
  3. wp8 json2csharp
  4. [转]省市二级联动(纯js实现)
  5. js 转化类似这样的时间( /Date(1389060261000)/)问题
  6. php引用(&amp;)详解及注意事项
  7. 计算阶乘并显示_winform (20以后的阶乘溢出)
  8. HTML5 实现拍照上传
  9. kickstart无人值守
  10. 一次 HTTP 请求响应过程的完整解析
  11. 洛谷P1434滑雪题解及记忆化搜索的基本步骤
  12. linux下添加逻辑分区并挂载(手动和自动方式)
  13. VBA找相似体积的单元格值
  14. POJ.1769.Minimizing maximizer(线段树 DP)
  15. .NET Core 指南 官方
  16. Sword STL之map效率问题
  17. 资料汇总--java开发程序员必备技能
  18. L198
  19. Lucio: We avoided Mourinho after every loss
  20. mysql随机查询符合条件的几条记录

热门文章

  1. Failed to resolve: common Open File 导入项目问题
  2. Nginx、HAProxy、LVS三者的优缺点
  3. Activiti流程设计工具
  4. 9-安装redis
  5. stm32 HAL库笔记(一)——普通IO口
  6. 同步对象(同步条件Event)
  7. python爬虫之scrapy
  8. 【FZSZ2017暑假提高组Day1】确定小组
  9. Activity中满屏和去标题的实现方法
  10. mybatis泛型(一)