考虑以下代码:
#include <pcre.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char **argv) {
char **ret = NULL, **t;
char *buffer;
pcre *re;
const char *error;
int erroffset, rc = 1, arraylength = 0, ovector[2], i = 0;
const char *string = "WORD";
buffer = malloc(strlen(string)+1);
re = pcre_compile("[A-Za-z0-9]+|\\\"[A-Za-z0-9\\s\\.'\\?]+\\\"", PCRE_MULTILINE, &error, &erroffset, NULL);
if (re == NULL ) printf ("pcre_compile error: %s\n", error);
while (rc > 0) {
rc = pcre_exec(re, NULL, string, strlen(string), i, 0, ovector, 2);
bzero(buffer, strlen(string));
pcre_copy_substring(string, ovector, rc, 0, buffer, strlen(string));
if (rc > 0) {
printf("BUFFER: %s\n", buffer);
}
i = ovector[1];
}
return 0;
}
这个输出是:
[bart@localhost tests]$ ./pcre
BUFFER:
我希望得到WORD
。当我在WORD
之后添加空格字符时:
const char *string = "WORD ";
确实有效:
[bart@localhost tests]$ ./pcre
BUFFER: WORD
另外,当我添加更多单词时,它可以正常工作。
我尝试测试我的正则表达式here,它告诉我它应该没有空格字符。
我在这里缺少什么?
更新当我将正则表达式更改为[A-Za-z0-9]+
时,如果没有空格,它仍无效。
答案 0 :(得分:0)
问题出在pcre_copy_substring
,缓冲区太小了。这样:
pcre_copy_substring(string, ovector, rc, 0, buffer, strlen(string)+1);
修好了。