2013-03-07 90 views
3
#include <stdio.h> 
#include <string.h> 
#include <pcre.h> 
#define OVECCOUNT 30 
#define SRCBUFFER 1024*1024 

int main(int argc, char **argv){ 
pcre *re; 
const char *error; 
int erroffset; 
int ovector[OVECCOUNT]; 
int rc, i; 
if (argc != 2){ 
    fprintf(stderr, "Usage : %s PATTERN\n", argv[0]); 
    return 1; 
} 

char *src=malloc(SRCBUFFER); 
int srclen = fread(src, sizeof(char), SRCBUFFER, stdin); 
re = pcre_compile(argv[1], 0, &error, &erroffset, NULL); 
if (re == NULL){ 
    fprintf(stderr, "PCRE compilation failed at offset %d: %s\n", erroffset, error); 
    return 1; 
} 

rc = pcre_exec(re, NULL, src, srclen, 0, 0, ovector, OVECCOUNT); 
if (rc < 0){ 
    if (rc == PCRE_ERROR_NOMATCH) fprintf(stderr, "Sorry, no match...\n"); 
    else fprintf(stderr, "Matching error %d\n", rc); 
    return 1; 
} 

for (i = 0; i < rc; i++){ 
    char *substring_start = src + ovector[2 * i]; 
    int substring_length = ovector[2 * i + 1] - ovector[2 * i]; 
    fprintf(stdout, "%2d: %.*s\n", i, substring_length, substring_start); 
} 
return 0; 
} 

来看,它PCRE C API只返回第一个匹配

回声 “苹果香蕉非洲” | ./program '\ BA \ w + \ B'

,并将其打印

0:苹果

我试图使用PCRE_MULTILINE选项,但没有use.How让它打印所有比赛?

+0

你的I/O完全没有错误检查,你甚至不知道你设法读取超过“苹果”。 – unwind 2013-03-07 12:18:46

+0

我补充一些,它返回: – riaqn 2013-03-07 12:22:56

+0

\ BA \ w + \ b 苹果香蕉非洲 0:苹果 – riaqn 2013-03-07 12:23:08

回答

2

这听起来像你正在寻找的是相当于Perl /g正则表达式标志重复匹配尽可能多次并返回所有匹配的结果。我不相信PCRE有这样的事情。

相反,您需要添加一个围绕pcre_exec的循环。每次调用它时,都会返回匹配开始和结束的字节偏移量。然后,您希望再次在比赛结束时的字符串上运行pcre_exec。重复,直到pcre_exec不匹配。

相关问题