2014-03-31 45 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