C++使用libpcre捕获多行数据
程序员文章站
2022-06-24 20:48:32
由于初次尝试用c++写个简单的爬虫系统,不免用到正则,正则有多行匹配等特性,以前一直用php开发pcre_match加上正则修正符m多行,i忽略大小写 s.代表任意字符,不要太方便...
由于初次尝试用c++写个简单的爬虫系统,不免用到正则,正则有多行匹配等特性,以前一直用php开发pcre_match加上正则修正符m多行,i忽略大小写 s.代表任意字符,不要太方便,所以在使用cpp的时候遇到了困惑。
实际上pcre匹配数据是多次去匹配的,
我匹配到一个数据,然后对源数据进行偏移,然后匹配下一个,这样子,知道最后一个
#include "pcre.h" #include #include #include #include #include #define OVECCOUNT 256 using namespace std; int tpcre(); int tmysql(); int main(int argc, char ** argv) { tpcre(); return 0; } int tmysql(){ return 0; } int tpcre(){ char pText[1024] = "\"21,537511285427,50005701,,shopsearch,1,shopcon,2950270077,,\" href=\"//detail.tmall.com/item.htm?id=537511285427&rn=54eb0efc1a7a49f5b93ed2051aa4fe9c&abbucket=0\" target=\"_blank\" data-gold-url=\"/inshopse\" href=\"//detail.tmall.com/item.htm?id=537511285421&rn=54eb0efc1a7a49f5b93ed2051aa4fe9c&abbucket=0\"href=\"//detail.tmall.com/item.htm?id=537511285422&rn=54eb0efc1a7a49f5b93ed2051aa4fe9c&abbucket=0\"href=\"//detail.tmall.com/item.htm?id=537511285423&rn=54eb0efc1a7a49f5b93ed2051aa4fe9c&abbucket=0\"href=\"//detail.tmall.com/item.htm?id=537511285424&rn=54eb0efc1a7a49f5b93ed2051aa4fe9c&abbucket=0\" "; /* string filename = "/Users/kang/Library/Developer/Xcode/DerivedData/TmailSpider-batmyukengwdwjcsejwqossttbhu/Build/Products/Debug/2.txt"; fstream fp; fp.open(filename); char buf[256]; string html; while (!fp.eof()) { fp.read(buf, 200); html.append(buf); } fp.close(); char *pText = (char*)html.c_str(); */ std::cout << pText; //const char * pPattern = "(\\d+)\\w+"; //const char *pPattern="href=\\\"(//detail.tmall.com/item.htm[^\\]+)\\"; //const char * pPattern = "(//detail.tmall.com/item.htm[^\\\\]+)"; const char * pPattern = "(//detail.tmall.com/item.htm\\?id=\\d+)"; const char * pErrMsg = NULL; pcre * pPcre = NULL; int nOffset = -1; //PCRE_MULTILINE|PCRE_UTF8|PCRE_NO_AUTO_CAPTURE //pPcre = pcre_compile(pPattern, PCRE_DOTALL|PCRE_CASELESS|PCRE_MULTILINE, &pErrMsg, &nOffset, NULL); pPcre = pcre_compile(pPattern, PCRE_DOTALL|PCRE_CASELESS|PCRE_MULTILINE, &pErrMsg, &nOffset, NULL); if(pPcre == NULL){ printf("pcre match error\n"); return 1; } int ovector[OVECCOUNT]; int matchFlag; int exec_offset = 0; int count = 0; do{ matchFlag = (int)pcre_exec(pPcre, NULL, pText, (int)strlen(pText),exec_offset,0, ovector, OVECCOUNT); if(matchFlag > 0){ ++count; printf("\nOK, has matched ...\n\n"); for(int i=0;i<matchflag;i++){ char="" *strstart="pText+ovector[2*i];" int="" substrlen="ovector[2*i+1]" -="" ovector[2*i];="" matched[1024];="" memset(matched,="" 0,="" 1024);="" strncpy(matched,="" strstart,="" substrlen);="" printf(="" "match:$%d="%s\n",i,matched" );="" }="" exec_offset="ovector[1];" }while="" (matchflag=""> 0); cout << "count="<
上一篇: C语言函数可变参数处理简介
下一篇: 数据结构-插入排序
推荐阅读
-
在Linux中使用tcpdump命令捕获与分析数据包详解
-
Laravel如何使用数据库事务及捕获事务失败后的异常详解
-
c++中使用类定义自己的数据类型
-
Effective Modern C++ 条款32 对于lambda,使用初始化捕获来把对象移动到闭包
-
SQLServer 2008 CDC实现数据变更捕获使用图文详解
-
C++ 实验二 NO.1_(3) 1:熟悉DEV环境,练习自己的第一个程序使用DEV集成环境来编辑,运行简单的数据输入和运算实验。(3)编写一个程序,要求:提示输入3个数;显示这3个数,求他们的平均值
-
C/C++中CJSON的使用(创建与解析JSON数据)
-
c++ 数据结构map的使用详解
-
C++使用libpcre捕获多行数据
-
在Linux中使用tcpdump命令捕获与分析数据包详解