2014-03-31 47 views
1

这应该很简单,但是我很难理解在C中的regex.h库中'+'的基本工作。不知道发生了什么问题。Posix正则表达式库+的用法

粘贴不起作用的示例代码。我想找到与B开始和一个结尾的字符串,可以有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 *的使用效果很好,但那不是我想要的。 因为我也想检查一下^ [BCD] + A $,它应该与BBBA或CCCCA或DDDDA相匹配。^[BCD] [BCD] * A $的用法不适用于我,因为它可能与BCCCA不匹配。 尝试在表达式中使用括号和括号,但它似乎没有帮助。

快速的帮助是非常感谢。

+0

是GNU'grep'接受的POSIX正则表达式吗?因为它不会将'+'(或'?'作为元字符)作为元字符 - 您必须用反斜杠将它们转义,或使用'-E'打开“Extended Regular Expressions”。 –

+0

感谢您的加入。我会根据您的意见和Alp的回答修改代码。 – shyam2347

回答

2

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

顺便说一句,此评论:

正如我也想检查类似^ [BCD] +应该匹配BBBA或CCCCA或 DDDDA $符号。^[BCD]的使用[BCD] *的规定,对我$不会工作可以匹配BCCCA这是不 所需的匹配

是基于怎样的量词+*工作的一种误解。正则表达式^[BCD]+A$^[BCD][BCD]*A$完全相同。

+0

感谢您帮助Alp。这澄清了我现在的困惑。我会相应地修改代码。 – shyam2347

+0

不客气。 (如果答案为您解决了问题,您可以将答案标记为已接受。) – Alp

+0

完成。对不起,我没有足够的代表点来回答你的问题。 – shyam2347