在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), 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;
}
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

else printf("Matching error %d\n", rc);
free(re);
return 1;
}
printf("\nOK, has matched

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 天下 閱讀(756) 評論(0) 編輯 收藏 引用 所屬分類: C/C++ 、Win32