IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    在vc中使用PCRE

    天下发表于 2016-03-02 02:04:00
    love 0
    在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), 0, 0, 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;
    }  




    天下 2016-03-02 10:04 发表评论


沪ICP备19023445号-2号
友情链接