Windows下VS2010编译PCRE

来源:互联网 发布:北京下雨了 知乎 编辑:程序博客网 时间:2024/05/30 21:59

Windows下VS2010编译PCRE

  • 前言:
  • 下载PCRE源代码
  • 对源代码进行一些处理
  • 创建VS2010工程编译PCRE
  • C语言使用PCRE的小例子

前言:

   在JAVA和PHP语言中正则表达式是自带的,不需要额外的工作就能使用到,然而在C语言中,要使用正则表达式则需要花费一番功夫。虽然linux平台下有正则表达式库,从VS2008开始也提供正则表达式库的支持,但是假设一段代码需要在两个平台下编译运行,那么使用本地平台的API则会导致不好移植。
   所以,百度了许多资料,终于找到了PCRE这个库。不过,这个库在windows平台下编译则需要多花费点心思,为了避免日后忘记和给同样想要编译尝试使用pcre库的人一个经验,特写下这篇博客作为记录。

一、下载PCRE源代码:

官网地址: www.pcre.org

里面有pcre 和pcre2的源码,我门只需要下载最新版的pcre源码就好。比如:pcre-8.39.tar.bz2。

二、对源代码进行一些处理:

1、 将源码根目录下的config.h.generic 重命名为 config.h。
编辑器打开,看看有没有HAVE_MEMMOVE和HAVE_BCOPY的宏定义,如>果有就将其注释掉。关键是HAVE_BCOPY的宏定义,因为windows并没有bcopy()这个函数。
定义SUPPORT_UTF宏,config.h里默认是/* #undef SUPPORT_UTF */,将>其修改为:#define SUPPORT_UTF 1。否则,则不支持Utf-8编码的文本。

2、 将源码根目录下的pcre.h.generic 为 pcre.h。

3、 将源码根目录下的pcre_chartables.c.dist 为 pcre_chartables.c。

三、创建VS2010工程编译PCRE

1、 打开VS2010,选择Win32控制台应用程序,输入项目名字:
这里写图片描述

2、 进入工程向导对话框,记得点击DLL单选框,然后点击完成:
这里写图片描述
3、 创建好程序后,将左侧工程目录下的头文件和源文件文件夹下的所有文件都移除。然后进入项目的目录,把刚才移除的文件通通删除。

4、 进入PCRE源码的根目录下,把所有后缀是.h的文件和prce_开头并以.c结尾的文件,复制到项目的目录下。打开VS2010,在头文件文件夹中添加刚才复制的.h文件,在源代码文件夹中添加刚才复制的.c文件。
这里写图片描述

5、 右键解决方法,点击属性。选择C/C++ –> 预处理器 –> 预处理器定义 –> 编辑,添加HAVE_CONFIG的宏定义。
这里写图片描述

6、 同样在工程的属性对话框中:C/C++ –> 代码生成 –> 运行库 –> 选择MT。
还有一个选项要设置:C/C++ –> 预编译头 –> 不使用预编译头。
这里写图片描述
这里写图片描述

7、 好了,这时候,就可以点击编译了。编译完成后,会在工程目录下的DEBUG文件夹,找到一个dll文件和lib文件,这些就是我们需要的东西。加上源代码目录中的pcre.h文件,就可以使用pcre库中的函数了。接下来我们看一个例子。

四、 C语言使用PCRE的小例子:

1、 使用方式概述:

1.1、 包含pcre.h头文件
1.2、 告诉编译器链接刚才我们编译的lib文件
#pragma comment(lib,”DLLPCRE.lib”)

2、 C语言pcre的小例子—检测手机号码运营商:

#include <stdio.h>#include "pcre.h"#pragma comment(lib,"DLLPCRE.lib")int main(void){    int erroroffset;    int offsetcount;    int offset[(10)*3];    const char * error;    char *cm_pattern = "^1(39|38|37|36|35|34|59|50|51|58|57|88|87|52|82|47)[0-9]{8}";    char *un_pattern = "^1(30|31|32|55|56|85|86|45)[0-9]{8}";    char *cdma_pattern = "^1(33|53|80|81|89|77)[0-9]{8}";    char *isnum_pattern = "^1[0-9]{10}$";    char str[15] = {0};    pcre *cmPN, *unPN, *cdmaPN, *isnumPN;    int cm, un, cdma, isnum;    printf("\n手机号码运营商检测,请输入您的手机号码:\n>");    scanf("%s", str);    cmPN = pcre_compile(cm_pattern, 0, &error, &erroroffset, NULL);    unPN = pcre_compile(un_pattern, 0, &error, &erroroffset, NULL);    cdmaPN = pcre_compile(cdma_pattern, 0, &error, &erroroffset, NULL);    isnumPN = pcre_compile(isnum_pattern, 0, &error, &erroroffset, NULL);       if (cmPN == NULL        &&unPN == NULL        &&cdmaPN == NULL        &&isnumPN == NULL){            printf("正则表达式错误!\n");    }    isnum = pcre_exec(isnumPN, NULL, str, strlen(str), 0, 0, offset, (10)*3);    if (isnum < 0){        if (isnum == PCRE_ERROR_NOMATCH){            printf("手机号码长度不是11位数!\n");        }else{            printf("正则表达式匹配错误!\n");        }        return 1;    }    cm = pcre_exec(cmPN, NULL, str, strlen(str), 0, 0, offset, (10)*3);    if (cm > 0){        printf("您输入的是:中国移动号码。\n");        return 0;    }    un = pcre_exec(unPN, NULL, str, strlen(str), 0, 0, offset, (10)*3);    if (un > 0){        printf("您输入的是:中国联通号码。\n");        return 0;    }    cdma = pcre_exec(cdmaPN, NULL, str, strlen(str), 0, 0, offset, (10)*3);    if (cdma > 0){        printf("您输入的是:中国电信号码。\n");        return 0;    }    return 0;}
0 0
原创粉丝点击