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

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. Xamarin+Prism开发详解七:Plugin开发与打包测试

    有了上章[Xamarin+Prism开发详解六:DependencyService与IPlatformInitializer的关系]的基础,现在来理解Plugin开发就简单了. 本文实例代码地址:ht ...

  2. 基于CentOS搭建个人Leanote云笔记本

    Leanote 依赖 MongoDB 作为数据存储,下面开始安装MongoDB: 1. 下载启动 MongoDB 下载 MongoDB 进入 /home 目录,并下载 MongoDB: cd /hom ...

  3. Hibernate多对一ManytoOne

    ------------------------Hibernate多对一ManytoOne 要点: ManytoOne配置在多端 可以配置级联操作 @ManyToOne(cascade=Cascade ...

  4. 如何修改element.style内联样式;

    如何修改element.style内联样式: 我们在写前面 web页面样式的时候,会发现有些时候,我们怎么修改 style里面的值,页面上的样式都不会修改,当你用工具查看时,会发现里面会有 eleme ...

  5. Python全栈开发记录_第一篇(循环练习及杂碎的知识点)

    Python全栈开发记录只为记录全栈开发学习过程中一些难和重要的知识点,还有问题及课后题目,以供自己和他人共同查看.(该篇代码行数大约:300行) 知识点1:优先级:not>and 短路原则:a ...

  6. Entity Frame Code First 简易教程

    简介 什么是ORM 搭建Entity FrameWork CodeFirst应用 数据库迁移 表属性常见配置 Entity FrameWork 一对多.多对多 一.简介 Entity Framewor ...

  7. hive mysql元数据,报错 Specified key was too long; max key length is 767 bytes

    Specified key was too long; max key length is 767 bytes 此错误为hive 元数据mysql 字符集编码问题 如 show create tabl ...

  8. RedHat 7.0更新升级openSSH7.4p1

    由于目前服务器上ssh版本较低,存在安全漏洞,需要升级到最新版本. 系统版本:RedHat 7.0 旧openSSH版本:6.4p1 新openSSH版本:7.4p1 升级方式:源码安装 安装操作步骤 ...

  9. SQLyog简介及其功能(附百度云盘下载地址)

    一.软件简介 SQLyog 是一个快速而简洁的图形化管理MYSQL数据库的工具,它能够在任何地点有效地管理你的数据库.SQLyog是业界著名的Webyog公司出品的一款简洁高效.功能强大的图形化MyS ...

  10. js程序的调试方法