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(®ex, "[a-c]{2}", 0);
if( reti ){ fprintf(stderr, "Could not compile regex\n"); return(1); }
/* Execute regular expression */
reti = regexec(®ex, "ab", 0, NULL, 0);
if( !reti ){
puts("Match");
}
else if( reti == REG_NOMATCH ){
puts("No match");
}
else{
regerror(reti, ®ex, 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(®ex);
return 0;
}
答案 0 :(得分:6)
您使用的是正则表达式方言,该方言不了解正则表达式中的量词{n}
。
一种解决方案是在创建REG_EXTENDED
对象时提供选项regex_t
作为最后一个参数而不是0。
reti = regcomp(®ex, "[a-c]{2}", REG_EXTENDED);
通过我的修改,请参阅http://ideone.com/oIBXxu了解您的代码演示。
正如Casimir et Hippolyte在评论中指出的那样,基本正则表达式也支持{}
量词,但是花括号必须在正则表达式中使用\
进行转义,再次必须在C中转义字符串为\\
。所以你可以使用
reti = regcomp(®ex, "[a-c]\\{2\\}", 0);
以及上述解决方案的替代方案(在http://ideone.com/x7vlIO下修改此行的Demo)。
您可以查看http://www.regular-expressions.info/posix.html以获取有关基本和扩展正则表达式之间差异的更多信息。