本文以項目實例說明一下posix C正則表達式的使用方法。
項目中有一個網絡管理模塊,需要訪問到Linux系統中可用的網卡,經過在網上搜羅,找到一種獲取網絡配置信息的方式,即調用getifaddrs();在返回的結果中進行遍歷和解析,找到所有以eth開頭的行,然後提取出對應的網卡名稱。因爲網卡名稱一般是eth後跟一個整數,爲簡單而準確的提取出網卡名稱,使用正則表達式進行匹配之行之有效的解決之道。
爲此需要構建正則表達式,最初根據項目的開發環境直接使用了qt提供的正則表達式類,很方便的實現這一功能。但是後來爲了把該模塊獨立出來,且不依賴與qt,所以就只好重新選擇實現這一功能的方法了。純C或C++是不支持正則表達式的,需要引入第三方庫,像boost,posix C正則庫以及其他的正則庫。
因爲在Linux下編程,正好posix也提供了C正則庫, 於是就使用該庫,使用過程如下代碼:
bool regexMatch(const char *regExpr, const char *str)
{
//TO DO
const int ERR_BUF_LENT = 128;
const int N_MATCHES = 10;
regex_t reg;
char errMsgBuf[ERR_BUF_LENT];
regmatch_t pMatch[N_MATCHES];
int errNo;
//編譯正則表達式
errNo = regcomp(®, regExpr, REG_EXTENDED | REG_ICASE);
if(!errNo)
{
errNo = regexec(®, str, sizeof(pMatch) / sizeof(regmatch_t), pMatch,0);
}
//釋放編譯過的正則表達式所使用的資源
regfree(®);
if(!errNo)
{
return true;
}
else
{
regerror(errNo, ®, errMsgBuf, sizeof(errMsgBuf));
std::cout << __FUNCTION__ << errMsgBuf << std::endl;
printf("%s\n", errMsgBuf);
return false;
}
}
大致分爲以下四步:
第一步,編譯正則表達式。通過調用regcomp完成,參數分別是存放編譯後的正則表達式的結構指針, 正則表達式源字符串,以及編譯正則表達式參數;
第二步,匹配字符串。調用regexec,這個函數的參數比較多一些,分別是,編譯後的正則表達式指針,被匹配字符串,存儲匹配結果的數組大小,以及存儲匹配結果的數組,和匹配規則參數;
第三步,引用匹配結果,通過遍歷存儲匹配結果的數組可得;
第四步,釋放編譯後的正則表達式,通過調用regfree,其參數即是編譯後的正則表達式指針。
如果,在執行編譯,比較的過程中,出現了錯誤,可以調用regerror來獲取錯誤原因。