C++ 提取网页内容系列之四正则
标 题: 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++ 提取网页内容系列之四正则的更多相关文章
- C++ 提取网页内容系列之三
标 题: C++ 提取网页内容系列作 者: itdef链 接: http://www.cnblogs.com/itdef/p/4171659.html 欢迎转帖 请保持文本完整并注明出处 这次继续下载 ...
- C++ 提取网页内容系列之二
标 题: C++ 提取网页内容系列作 者: itdef链 接: http://www.cnblogs.com/itdef/p/4171203.html 欢迎转帖 请保持文本完整并注明出处 另外一种下载 ...
- C++ 提取网页内容系列之一
标 题: C++ 提取网页内容系列作 者: itdef链 接: http://www.cnblogs.com/itdef/p/4171179.html 欢迎转帖 请保持文本完整并注明出处 首先分析网页 ...
- C++ 提取网页内容系列之五 整合爬取豆瓣读书
工作太忙 没有时间细化了 就说说 主要内容吧 下载和分析漫画是分开的 下载豆瓣漫画页面是使用之前的文章的代码 见http://www.cnblogs.com/itdef/p/4171179.html ...
- 在.NET中使用JQuery 选择器精确提取网页内容
1. 前言 相信很多人做开发时都有过这样的需求:从网页中准确提取所需的内容.思前想后,方法无非是以下几种:(本人经验尚浅,有更好的方法还请大家指点) 1. 使用正则表达式匹配所需元素.(缺点:同类型的 ...
- Sql Server来龙去脉系列之四 数据库和文件
在讨论数据库之前我们先要明白一个问题:什么是数据库? 数据库是若干对象的集合,这些对象用来控制和维护数据.一个经典的数据库实例仅仅包含少量的数据库,但用户一般也不会在一个实例上创建太多 ...
- 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 ...
- .NET 4 并行(多核)编程系列之四 Task的休眠
原文:.NET 4 并行(多核)编程系列之四 Task的休眠 .NET 4 并行(多核)编程系列之四 Task的休眠 前言:之前的几篇文章断断续续的介绍了Task的一些功能:创建,取消.本篇介绍Tas ...
- .Neter玩转Linux系列之四:Linux下shell介绍以及TCP、IP基础
基础篇 .Neter玩转Linux系列之一:初识Linux .Neter玩转Linux系列之二:Linux下的文件目录及文件目录的权限 .Neter玩转Linux系列之三:Linux下的分区讲解 .N ...
随机推荐
- Linux背背背(2)
目录: 1.简单命令 2.目录切换命令 3.扩展命令 简单命令 ls 语法1:#ls [路径] 表示列出指定路径下的文件夹和文件的名字,如果路径没有指定则列出当前路径下的 语法2 ...
- Oracle 学习笔记(六)
Oracle 数据库常用的闪回sql 语句及其它操作语句: --Oracle 数据库dml sql -- 查看当前用户所拥有的表 select * from tab; --表空间,auto: 自动管理 ...
- Synchronized方法锁、对象锁、类锁区别
synchronized,这个东西我们一般称之为”同步锁“,他在修饰代码块的时候需要传入一个引用对象作为“锁”的对象. 在修饰方法的时候,默认是当前对象作为锁的对象 在修饰类时,默认是当前类的Clas ...
- JAVA多线程17个问题
1.Thread 类中的start() 和 run() 方法有什么区别? Thread.start()方法(native)启动线程,使之进入就绪状态,当cpu分配时间该线程时,由JVM调度执行run( ...
- 学习excel的使用技巧四显示正常的数字
记得之前在excel中输入一些数字比如输入手机号 就会变成1.E几类似这种 那么怎样显示正常的数字呢 先选中要操作的输入框 1 找到 数字 这个功能的地方 2 设置为 数值 并且小数点为0 3 ...
- 买二手iphone的建议
手机到手后一定要在第一时间把“按键开关.指纹解锁.指南针.照相机.话筒.听筒.手电筒.定位.WiFi”都测一遍. 环境有无wifi:imei:×××××序列号:××××× 外观和零件:1外观,1是否粗 ...
- orcal安装
1.下载安装包(版本32位或64位)下载网址:https://www.oracle.com,建议关闭防火墙(可以的话关闭网) 2.将两个安装包解压为一个安装包 3.点击执行 3. 4. 5. 5. 6 ...
- Oracle 关联查询
select count(1),a.policy_id from gp_pol_prod a where a.product_id=8401 group by a.policy_id having c ...
- linux使用privoxy将55转为http代理
=============================================== 2018/3/21_第3次修改 ccb_warlock 更新 ...
- 使用swiper插件,隐藏swiper后再显示,不会触发自动播放的解决办法
问题: 项目中有一个需求,当点击P1时,两个页面进行轮播.当点击P2时,页面不轮播. 设置好以后,点击P2,再点击P1,此时页面不能自动轮播,只能手动触发. 解决: 在轮播器配置里,配置observe ...