Curley大括号在C语言中不能用于正则表达式

时间:2015-05-13 10:27:48

标签: c regex

Curly大括号{}在C语言正则表达式中不起作用,如果我将正确的输入作为“ab”或“ac”,它总是给出输出为NO匹配。在这种情况下我会请求帮助。

 #include <sys/types.h>
  #include <regex.h>
  #include <stdio.h>


   int main(int argc, char *argv[]){ regex_t regex;
        int reti;
        char msgbuf[100];

        /* Compile regular expression */
        reti = regcomp(&regex, "[a-c]{2}", 0);
        if( reti ){ fprintf(stderr, "Could not compile regex\n"); return(1); }

        /* Execute regular expression */
        reti = regexec(&regex, "ab", 0, NULL, 0);
        if( !reti ){
                puts("Match");
        }
        else if( reti == REG_NOMATCH ){
                puts("No match");
        }
        else{
                regerror(reti, &regex, msgbuf, sizeof(msgbuf));
                fprintf(stderr, "Regex match failed: %s\n", msgbuf);
                return 1;
        }

       /* Free compiled regular expression if you want to use the regex_t again */
        regfree(&regex);

        return 0;
}

1 个答案:

答案 0 :(得分:6)

您使用的是正则表达式方言,该方言不了解正则表达式中的量词{n}

一种解决方案是在创建REG_EXTENDED对象时提供选项regex_t作为最后一个参数而不是0。

reti = regcomp(&regex, "[a-c]{2}", REG_EXTENDED);

通过我的修改,请参阅http://ideone.com/oIBXxu了解您的代码演示。

正如Casimir et Hippolyte在评论中指出的那样,基本正则表达式也支持{}量词,但是花括号必须在正则表达式中使用\进行转义,再次必须在C中转义字符串为\\。所以你可以使用

reti = regcomp(&regex, "[a-c]\\{2\\}", 0);

以及上述解决方案的替代方案(在http://ideone.com/x7vlIO下修改此行的Demo)。

您可以查看http://www.regular-expressions.info/posix.html以获取有关基本和扩展正则表达式之间差异的更多信息。