标 题: 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

首先来个简单例子

  1. #include <string>
  2. #include <iostream>
  3. #include <regex>
  4.  
  5. using namespace std::tr1;
  6. using namespace std;
  7.  
  8. string strContent = " onclick=\"VeryCD.TrackEvent('base', '首页大推', '神雕侠侣');";
  9.  
  10. void Test1()
  11. {
  12. string strText = strContent;
  13. string strRegex = "首页大推";
  14. regex regExpress(strRegex);
  15.  
  16. smatch ms;
  17.  
  18. cout << "*****************************" << endl;
  19. cout << "Test 1" << endl << endl;
  20.  
  21. while(regex_search(strText, ms, regExpress))
  22. {
  23. for(string::size_type i = ;i < ms.size();++i)
  24. {
  25. cout << ms.str(i).c_str() << endl;
  26. }
  27. strText = ms.suffix().str();
  28. }
  29.  
  30. cout << "*****************************" << endl << endl;
  31. }
  32.  
  33. void Test2()
  34. {
  35. string strText = strContent;
  36. string strRegex = "首页大推.*'(.*)'";
  37. regex regExpress(strRegex);
  38.  
  39. smatch ms;
  40.  
  41. cout << "*****************************" << endl;
  42. cout << "Test 2" << endl << endl;
  43. while(regex_search(strText, ms, regExpress))
  44. {
  45. for(string::size_type i = ;i < ms.size();++i)
  46. {
  47. cout << ms.str(i).c_str() << endl;
  48. }
  49. strText = ms.suffix().str();
  50. }
  51. cout << "*****************************" << endl << endl;
  52. }
  53.  
  54. int _tmain(int argc, _TCHAR* argv[])
  55. {
  56. Test1();
  57. Test2();
  58.  
  59. return ;
  60. }

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= 之后 在两个" " 之间的内容

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

  1. /*******************************************************************************
  2. * @file
  3. * @author def< qq group: 324164944 >
  4. * @blog http://www.cnblogs.com/itdef/
  5. * @brief
  6. /*******************************************************************************/
  7.  
  8. #include <string>
  9. #include <iostream>
  10. #include <regex>
  11.  
  12. using namespace std::tr1;
  13. using namespace std;
  14.  
  15. string strContent = " onclick=\"VeryCD.TrackEvent('base', '首页大推', '神雕侠侣');";
  16.  
  17. string strContent0 = "alt=\"火影忍者\" /><div class=\"play_ico_middle\"></div><div class=\"cv-title\" style=\"width:85px;\">更新至612集</div>";
  18.  
  19. void Test1()
  20. {
  21. string strText = strContent;
  22. string strRegex = "首页大推";
  23. regex regExpress(strRegex);
  24.  
  25. smatch ms;
  26.  
  27. cout << "*****************************" << endl;
  28. cout << "Test 1" << endl << endl;
  29.  
  30. while(regex_search(strText, ms, regExpress))
  31. {
  32. for(string::size_type i = ;i < ms.size();++i)
  33. {
  34. cout << ms.str(i).c_str() << endl;
  35. }
  36. strText = ms.suffix().str();
  37. }
  38.  
  39. cout << "*****************************" << endl << endl;
  40. }
  41.  
  42. void Test2()
  43. {
  44. string strText = strContent;
  45. string strRegex = "首页大推.*'(.*)'";
  46. regex regExpress(strRegex);
  47.  
  48. smatch ms;
  49.  
  50. cout << "*****************************" << endl;
  51. cout << "Test 2" << endl << endl;
  52. while(regex_search(strText, ms, regExpress))
  53. {
  54. for(string::size_type i = ;i < ms.size();++i)
  55. {
  56. cout << ms.str(i).c_str() << endl;
  57. }
  58. strText = ms.suffix().str();
  59. }
  60. cout << "*****************************" << endl << endl;
  61. }
  62.  
  63. void Test3()
  64. {
  65. string strText = strContent0;
  66. string strRegex = "alt=\"([^\"]*)\".*width:85px;\">(.*)</div>";
  67. regex regExpress(strRegex);
  68.  
  69. smatch ms;
  70.  
  71. cout << "*****************************" << endl;
  72. cout << "Test 3" << endl << endl;
  73.  
  74. while(regex_search(strText, ms, regExpress))
  75. {
  76. for(string::size_type i = ;i < ms.size();++i)
  77. {
  78. if(i > )
  79. cout << ms.str(i).c_str() << endl;
  80. }
  81. strText = ms.suffix().str();
  82. }
  83. cout << "*****************************" << endl << endl;
  84.  
  85. }
  86.  
  87. int _tmain(int argc, _TCHAR* argv[])
  88. {
  89. Test1();
  90. Test2();
  91. Test3();
  92.  
  93. return ;
  94. }

C++ 提取网页内容系列之四正则的更多相关文章

  1. C++ 提取网页内容系列之三

    标 题: C++ 提取网页内容系列作 者: itdef链 接: http://www.cnblogs.com/itdef/p/4171659.html 欢迎转帖 请保持文本完整并注明出处 这次继续下载 ...

  2. C++ 提取网页内容系列之二

    标 题: C++ 提取网页内容系列作 者: itdef链 接: http://www.cnblogs.com/itdef/p/4171203.html 欢迎转帖 请保持文本完整并注明出处 另外一种下载 ...

  3. C++ 提取网页内容系列之一

    标 题: C++ 提取网页内容系列作 者: itdef链 接: http://www.cnblogs.com/itdef/p/4171179.html 欢迎转帖 请保持文本完整并注明出处 首先分析网页 ...

  4. C++ 提取网页内容系列之五 整合爬取豆瓣读书

    工作太忙 没有时间细化了 就说说 主要内容吧 下载和分析漫画是分开的 下载豆瓣漫画页面是使用之前的文章的代码 见http://www.cnblogs.com/itdef/p/4171179.html ...

  5. 在.NET中使用JQuery 选择器精确提取网页内容

    1. 前言 相信很多人做开发时都有过这样的需求:从网页中准确提取所需的内容.思前想后,方法无非是以下几种:(本人经验尚浅,有更好的方法还请大家指点) 1. 使用正则表达式匹配所需元素.(缺点:同类型的 ...

  6. Sql Server来龙去脉系列之四 数据库和文件

        在讨论数据库之前我们先要明白一个问题:什么是数据库?     数据库是若干对象的集合,这些对象用来控制和维护数据.一个经典的数据库实例仅仅包含少量的数据库,但用户一般也不会在一个实例上创建太多 ...

  7. Red Gate系列之四 SQL Data Compare 10.2.0.885 Edition 数据比较同步工具 完全破解+使用教程

    原文:Red Gate系列之四 SQL Data Compare 10.2.0.885 Edition 数据比较同步工具 完全破解+使用教程 Red Gate系列之四 SQL Data Compare ...

  8. .NET 4 并行(多核)编程系列之四 Task的休眠

    原文:.NET 4 并行(多核)编程系列之四 Task的休眠 .NET 4 并行(多核)编程系列之四 Task的休眠 前言:之前的几篇文章断断续续的介绍了Task的一些功能:创建,取消.本篇介绍Tas ...

  9. .Neter玩转Linux系列之四:Linux下shell介绍以及TCP、IP基础

    基础篇 .Neter玩转Linux系列之一:初识Linux .Neter玩转Linux系列之二:Linux下的文件目录及文件目录的权限 .Neter玩转Linux系列之三:Linux下的分区讲解 .N ...

随机推荐

  1. MySql开启远程账户登陆总结

    1.更改 "mysql" 数据库里的 "user" 表里的 "host" 项,从"127.0.0.1"改成"% ...

  2. hash的排序(转载)

    sort函数 sort LISTsort BLOCK LISTsort SUBNAME LIST sort 的用法有如上3种形式.它对LIST进行排序,并返回排序后的列表.假如忽略了SUBNAME或B ...

  3. 学习MeteoInfo二次开发教程(七)

    1.站点文件 12010615.syn在D:\Program Files (x86)\MeteoInfo\SampleSYNOP_Stations.csv在D:\Program Files (x86) ...

  4. vi 常用 文本编辑 技巧

    归纳常用的Vi/Vim 文本编辑技巧,便于以后查阅. 一.把空格替换为换行 :% s/ /\r/g 二.把空行删除 :g/^$/d 三.vim以16进制打开和编辑文件 先用vim以二进制格式打开需要编 ...

  5. Linux常用命令大全(分类)

    首先按ESC键回到命令模式: vi保存文件有不同的选项,对应于不同的命令,你可以从下面的命令中选择一个需要的::w 保存文件但不退出vi :w file 将修改另外保存到file中,不退出vi:w! ...

  6. eclipse的安装和汉化

    下载 打开浏览器输入网址 www.eclipse.org/ ,回车( Enter ) 点击下载( DOWNLOAD ) 会进入一个新的页面,点击下载软件包(Download Packages) 找到对 ...

  7. cookies的常见方式

    cookie有如下特点 保存在客户端,一般由浏览器负责存储在本地. 通常是加密存储的,不过由于存储在本地,很难保证数据不被非法访问,并不怎么安全,所以cookies中不宜保存敏感信息,如密码等. 哪些 ...

  8. centos密码策略

    centos7密码策略 https://blog.csdn.net/qq_36896749/article/details/80264280 centos7设置密码规则 https://blog.cs ...

  9. Spring MVC和Spring Boot的理解以及比较

    Spring MVC是什么?(1)Spring MVC是Spring提供的一个强大而灵活的模块式web框架.通过Dispatcher Servlet, ModelAndView 和 View Reso ...

  10. IOS 发布 升级新版本

    ERROR ITMS-90725: "SDK Version Issue. ERROR ITMS-90725: "SDK Version Issue. This app was b ...