关于PCRE在VC中的使用

PCRE 官网 http://www.pcre.org/
PCRE Windows版本(包含已编译文件) http://www.psyon.org/projects/pcre-win32/index.php

1)psyon.org编译好的lib只能在vc7以上版本使用,因为这些lib使用了/GS编译开关。
在vc显示如下错误:
error LNK2001:unresolved external symbol __security_cookie
2)用静态链接一定要预定义PCRE_STATIC宏。
3)自己编译PCRE的注意事项(未尝试)
运行时库与宿主程序一致;
默认pcre以递归方式调用match处理较大的串时可能栈溢出,
处理方法一:config.h中#define NO_RECURSE
方法二:采用pcre_recurse_malloc从堆中分配内存。


//---------------------------
PCRE测试代码
/* Compile thuswise:   
*   gcc -Wall pcre1.c -I/usr/local/include -L/usr/local/lib -R/usr/local/lib -lpcre
*     
*/    

#include <stdio.h>
#include <string.h>
#include <pcre.h>
               
#define OVECCOUNT 30    /* should be a multiple of 3 */
       
int main()
{              
        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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 PCRE2 匹配文,您需要考虑以下几点: 1. 文的编码方式:文通常使用 UTF-8 编码,所以您需要确保在 PCRE2 使用 UTF-8 编码。 2. 使用 Unicode 属性:PCRE2 提供了 Unicode 属性,可以识别不同的字符类别,包括文字符。 以下是一个使用 PCRE2 匹配文的示例代码: ``` #include <stdio.h> #include <pcre2.h> int main() { const char* pattern = "\\p{Han}+"; // 匹配文字符 const char* subject = "你好,世界!Hello, world!"; PCRE2_SPTR pattern_utf8 = (PCRE2_SPTR)pattern; PCRE2_SPTR subject_utf8 = (PCRE2_SPTR)subject; int errorcode, rc; PCRE2_SIZE erroroffset; pcre2_code* re; pcre2_match_data* match_data; // 编译正则表达式 re = pcre2_compile(pattern_utf8, PCRE2_ZERO_TERMINATED, 0, &errorcode, &erroroffset, NULL); if (re == NULL) { printf("PCRE2 compilation failed at offset %d: %s\n", (int)erroroffset, pcre2_get_error_message(errorcode)); return 1; } // 准备匹配数据 match_data = pcre2_match_data_create_from_pattern(re, NULL); // 执行匹配 rc = pcre2_match(re, subject_utf8, PCRE2_ZERO_TERMINATED, 0, 0, match_data, NULL); if (rc < 0) { printf("PCRE2 matching failed: %d\n", rc); return 1; } // 输出匹配结果 printf("Matched %d characters:\n", rc); PCRE2_SPTR match_str = subject_utf8 + pcre2_get_startchar(match_data); for (int i = 0; i < rc; i++) { printf("%c", (char)match_str[i]); } printf("\n"); // 释放资源 pcre2_match_data_free(match_data); pcre2_code_free(re); return 0; } ``` 该示例使用 `\p{Han}+` 正则表达式匹配文字符,输出结果为: ``` Matched 6 characters: 你好世界 ``` 注意,由于英文字符混合,输出结果可能不是您期望的。如果您只想匹配文字符,可以将正则表达式修改为 `\p{Han}+`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值