如何使用PCRE获取所有匹配组?

我没有使用C的经验,我需要使用PCRE来获得匹配。
以下是我的源代码示例:

int test2() { const char *error; int erroffset; pcre *re; int rc; int i; int ovector[OVECCOUNT]; char *regex = "From:([^@]+)@([^\r]+)"; char str[] = "From:regular.expressions@example.com\r\n"\ "From:exddd@43434.com\r\n"\ "From:7853456@exgem.com\r\n"; re = pcre_compile ( regex, /* the pattern */ 0, /* default options */ &error, /* for error message */ &erroffset, /* for error offset */ 0); /* use default character tables */ if (!re) { printf("pcre_compile failed (offset: %d), %s\n", erroffset, error); return -1; } rc = pcre_exec ( re, /* the compiled pattern */ 0, /* no extra data - pattern was not studied */ str, /* the string to match */ strlen(str), /* the length of the string */ 0, /* start at offset 0 in the subject */ 0, /* default options */ ovector, /* output vector for substring information */ OVECCOUNT); /* number of elements in the output vector */ if (rc < 0) { switch (rc) { case PCRE_ERROR_NOMATCH: printf("String didn't match"); break; default: printf("Error while matching: %d\n", rc); break; } free(re); return -1; } for (i = 0; i < rc; i++) { printf("%2d: %.*s\n", i, ovector[2*i+1] - ovector[2*i], str + ovector[2*i]); } } 

在此演示中,输出仅为:

0: From:regular.expressions@example.com
1: regular.expressions
2: example.com

我想输出所有的比赛; 我怎样才能做到这一点?

我使用一个类来包装PCRE以使其更容易,但在pcre_exec之后,ovector包含您需要在原始字符串中查找匹配项的子字符串索引。

所以它会是这样的:

 #include  #include  #include "pcre.h" int main (int argc, char *argv[]) { const char *error; int erroffset; pcre *re; int rc; int i; int ovector[100]; char *regex = "From:([^@]+)@([^\r]+)"; char str[] = "From:regular.expressions@example.com\r\n"\ "From:exddd@43434.com\r\n"\ "From:7853456@exgem.com\r\n"; re = pcre_compile (regex, /* the pattern */ PCRE_MULTILINE, &error, /* for error message */ &erroffset, /* for error offset */ 0); /* use default character tables */ if (!re) { printf("pcre_compile failed (offset: %d), %s\n", erroffset, error); return -1; } unsigned int offset = 0; unsigned int len = strlen(str); while (offset < len && (rc = pcre_exec(re, 0, str, len, offset, 0, ovector, sizeof(ovector))) >= 0) { for(int i = 0; i < rc; ++i) { printf("%2d: %.*s\n", i, ovector[2*i+1] - ovector[2*i], str + ovector[2*i]); } offset = ovector[1]; } return 1; } 

注意:pcre_exec()的最后一个参数必须是element-count,而不是sizeof()! ( http://www.pcre.org/readme.txt