考虑这段代码:
#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]+
时,如果没有空格,它仍然无法工作。
最佳答案
问题出在pcre_copy_substring
,缓冲区太小。这:
pcre_copy_substring(string, ovector, rc, 0, buffer, strlen(string)+1);
修复它。
关于c - 正则表达式末尾需要一个额外的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47250620/