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;}
- Windows下VS2010编译PCRE
- Windows下编译pcre
- Linux和windows下编译pcre
- 在WINDOWS下编译PCRE库
- windows平台编译pcre
- windows下配置pcre
- windows下配置pcre
- 如何在Windows下通过Cmake编译和使用PCRE
- 正则库相关及windows-VS-C++环境下pcre && pcre++的编译和使用
- Windows下编译OpenSSL (VS2010)
- Windows下编译OpenSSL (VS2010)
- Windows下编译OpenSSL (VS2010)
- Windows下编译OpenSSL (VS2010)
- windows平台手动编译pcre
- pcre++ windows版本编译过程
- PCRE在windows+VS2013编译
- 在Windows下vs2010编译SQLite
- windows下使用vs2010编译live555
- wap网站访客手机号抓取的问题,最近网友一直在热议这个问题
- JVM调优总结(一)-堆和栈概念
- C深度剖析读书笔记-第五章内存管理
- 数据结构与算法分析 c++11 练习3.6 JosePhus 问题(Josephus problem)
- SpringMVC中JSON数据交互
- Windows下VS2010编译PCRE
- eclipse如何自动生成get,set方法,构造器,以及如何调整格式
- Atlantis HDU
- 如何实现抓取网站访客手机号的功能
- SetWindowPos设置窗口的Z轴次序
- 使用bootstrap-loader来构建应用的完整demo
- C strcpy
- memset用法
- switch case