天下

记录修行的印记

在vc中使用PCRE

在vc中使用PCRE
1. PCRE简介
正则表达式(regular expression),通常简写为regex、regexp或RE,使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。
PCRE(Perl Compatible Regular Expressions),是一个函数库,由Philip Hazel开发,该函数库使用与Perl5一样的语法和语义实现了正则表达式的模式匹配功能。PCRE是免费开源的,它是由C语言实现。很多著名的开源软件如Apache、PHP、KDE、Nginx 等都使用了PCRE。官方主页–http:
//www.pcre.org,目前(2016.03)最新版本是8.38。

2 编译 PCRE
PCRE的作者Philip Hazel是在linux上工作的,所以编译PCRE最好的办法自然是configure, make, make install三步曲了。在windows下, cygwin或者MinGW都支持这么做。
在windows下编译 PCRE要用CMake。
先从 http:
//www.cmake.org 上下载最新版的CMake,
在解压缩后的PCRE目录下建个子目录build,比如我的D:\pcre-8.38\build。
设置要编译的源代码的路径以及编译好的二进制文件存放的路径
CMake 会读取源代码目录下的文件 CMakeLists.txt ,然后将读到的配置以红颜色显示出来,此时可以根据我们的需要适当的选择或去掉一些配置,比如加上 PCRE_SUPPORT_UTF,去掉PCRE_SUPPORT_JIT(不需要嵌入式的代码)、PCRE_BUILD_PCRECPP(我只想要c形式的库);还可以修改一些配置的值,比如把PCRE_NEWLINE从LF改成CRLF。然后再点一下
"Configure”,最后点"Generate”,你会发现在build目录里生成了一系列的vc6的工程文件以及一些.h文件和.c文件。

3 在工程中使用PCRE
包含头文件 #include “pcre.h”
链接静态库 #pragma comment(lib,“pcre.lib”)
在项目”预处理器定义“中加上PCRE_STATIC

示例代码:
#include 
"stdafx.h"
#define PCRE_STATIC
#include 
"pcrecpp.h"
#include 
<vector>
#include 
<iostream>
#include 
<string>
#pragma comment(lib,
"lib/pcrecppd.lib")
#pragma comment(lib,
"lib/pcred.lib")
using namespace std;
using namespace pcrecpp;

int Test1()
{
    
#define OVECCOUNT 30    /* should be a multiple of 3 */
    pcre            
*re; 
    
const char      *error;
    
int             erroffset;
    
int             ovector[OVECCOUNT];
    
int             rc, i;

    
char            src    [] = "111 <title>Hello World</title> 222";
    
char            pattern   [] = "<title>(.*)</title>";

    printf(
"String : %s\n", src);
    printf(
"Pattern: \"%s\"\n", pattern);


    re 
= pcre_compile(pattern, 0&error, &erroffset, NULL);
    
if (re == NULL) {
        printf(
"PCRE compilation failed at offset %d: %s\n", erroffset, error);
        
return 1;
    }

    rc 
= pcre_exec(re, NULL, src, strlen(src), 00, ovector, OVECCOUNT);
    
if (rc < 0) {
        
if (rc == PCRE_ERROR_NOMATCH) printf("Sorry, no match \n");
        
else    printf("Matching error %d\n", rc);
        free(re);
        
return 1;
    }

    printf(
"\nOK, has matched \n\n");

    
for (i = 0; i < rc; i++) {
        
char *substring_start = src + ovector[2*i];
        
int substring_length = ovector[2*i+1- ovector[2*i];
        printf(
"%2d: %.*s\n", i, substring_length, substring_start);
    }

    free(re);
    
return 0
}


int main()  
{  
    Test1();
    
return 0;
}  


posted on 2016-03-02 10:04 天下 阅读(234) 评论(0)  编辑 收藏 引用 所属分类: C/C++Win32


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2016年3月>
282912345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

常用链接

留言簿(4)

随笔分类(376)

随笔档案(325)

链接

最新随笔

搜索

最新评论