在Posix Regex库中使用+

时间:2014-03-31 03:16:39

标签: c regex regex-greedy

这应该很简单,但我无法理解' +'的基本工作。在C.的regex.h库中。不确定出了什么问题。

粘贴不起作用的示例代码。我想找一个以B开头并以A结尾的字符串,可能会出现多次B,所以我想用B +

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

/* Compile regular expression */
reti = regcomp(&regex, "^B+A$", 0);
if( reti)
{
    printf("Could not compile regex\n");
    exit(1);
}

/* Execute regular expression */
reti = regexec(&regex, "BBBA", 0, NULL, 0);
if (!reti )
{
    printf("Match\n");
}
else if( reti == REG_NOMATCH )
{
    printf("No match\n");
}
else
{
    printf("Regex match failed\n");
    exit(1);
}

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

这找不到匹配,但我无法理解为什么。

使用^ BB * A $工作正常,但这不是我想要的。 因为我也想检查^ [BCD] + A $之类的东西,它应该与BBBA或CCCCA或DDDDA相匹配。使用^ [BCD] [BCD] * A $对我不起作用,因为它可以匹配不是所需匹配的BCCCA。 尝试在表达式中使用括号和括号,但它似乎没有帮助。

非常感谢快速帮助。

1 个答案:

答案 0 :(得分:2)

默认情况下regcomp()将模式编译为所谓的Basic Regular Expression;在这种正则表达式中,+运算符不可用。您尝试使用的正则表达式语法称为Extended Regular Expression语法。为了让regcomp()使用更广泛的语法,您需要将REG_EXTENDED标记传递给它。

顺便说一下,这个评论:

  

因为我也想检查^ [BCD] + A $之类的东西,它应该与BBBA或CCCCA匹配或者   DDDDA。使用^ [BCD] [BCD] * A $对我不起作用,因为它可以匹配BCCCA而不是   想要的比赛

基于对量词+*如何工作的误解。正则表达式^[BCD]+A$^[BCD][BCD]*A$完全等效。