标 题: 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 = 0;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 = 0;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 0; }
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 = 0;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 = 0;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 = 0;i < ms.size();++i) { if(i > 0) cout << ms.str(i).c_str() << endl; } strText = ms.suffix().str(); } cout << "*****************************" << endl << endl; } int _tmain(int argc, _TCHAR* argv[]) { Test1(); Test2(); Test3(); return 0; }