我对C语言中的一个简单正则表达式有问题,我的上一个匹配项无法识别。
这是我的代码:

#include <regex.h>
int dummy(const char *s) {
    size_t nmatch = 0, i;
    regex_t preg;
    regmatch_t  *pmatch = NULL;
    char str_regex[255 + 1];

    /* Format : ID <ID> L {<Label>} R <Res> C {Info} T {More info} */
    /* "C" and "T" aren't required */
    snprintf(str_regex, 255,
                    "ID ([[:alnum:]]{1,%d}) L \\{([^}]{1,%d})\\} R ([01])( C \\{[^}]+\\})?( T \\{[^}]+\\})?$",
                    25, // Max 25 chars for id
                    100); // Max 100 chars for label


    if (regcomp(&preg, str_regex, REG_EXTENDED) != 0) {
            fprintf(stderr, "Error initialization\n");
            return 2;
    }
    // We got the number of matches
    nmatch = preg.re_nsub;
    pmatch = malloc (sizeof (*pmatch) * nmatch);
    // EDIT : problem solved with pmatch = malloc(size of(*pmatch) * (nmatch + 1));
    if (pmatch == NULL) {
            fprintf(stderr, "Memory error\n");
            return 4;
    }

    // String can't be found
    // EDIT : problem solved with : if (regexec(&preg, s, nmatch + 1, pmatch, 0) != 0) {
    if (regexec(&preg, s, nmatch, pmatch, 0) != 0) {
            regfree(&preg);
            free(pmatch); pmatch = NULL;
            fprintf(stderr, "String not valid\n");
            return 5;
    }
    regfree (&preg);

    // EDIT : problem solved with : for (i = 0; i < nmatch + 1; ++i) {
    for (i = 0; i < nmatch; ++i) {
            char tmp[1000]; // Just for test, 1000 char not necessary
            int start = pmatch[i].rm_so;
            int finish = pmatch[i].rm_eo;
            memset(tmp, 0, sizeof(tmp));
            strncpy(tmp, s + start, finish - start);
            printf("Match %d : <%s>\n", i, tmp);
    }
}

输入字符串如下:ID ID1 L {Label} R 1 C {Info1} T {Info2}
我想有5场比赛
完整的链条,没关系
<ID1>,没关系
<Label>,没关系
<1>,没关系
<C {Info1}>,没关系
<T {Info2}>,它不起作用
你知道为什么最后一场比赛不成功吗?
如果我使用没有或带有最后一部分的链,它的工作原理相同。“T”部分永远不会被识别。。。
编辑:用“nmatch+1”而不是nmatch解决问题,请参见“编辑”部分上方的代码

最佳答案

根据man 3 regexre_nsub包含RE中的子表达式数。既然您也要捕获完整的字符串,难道不需要malloc(sizeof(*pmatch) * (nmatch + 1))

关于c - 正则表达式C-缺少比赛?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38016867/

10-11 18:09