正则表达式最后需要一个额外的空格

时间:2017-11-12 15:39:25

标签: c regex

考虑以下代码:

#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]+时,如果没有空格,它仍无效。

1 个答案:

答案 0 :(得分:0)

问题出在pcre_copy_substring,缓冲区太小了。这样:

pcre_copy_substring(string, ovector, rc, 0, buffer, strlen(string)+1);

修好了。