Linux下C正則表達式使用方法

本文以項目實例說明一下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(&reg, regExpr, REG_EXTENDED | REG_ICASE);
    if(!errNo)
    {
        errNo = regexec(&reg, str, sizeof(pMatch) / sizeof(regmatch_t), pMatch,0);
    }

    //釋放編譯過的正則表達式所使用的資源
    regfree(&reg);
    if(!errNo)
    {
        return true;
    }
    else
    {
        regerror(errNo, &reg, errMsgBuf, sizeof(errMsgBuf));
        std::cout << __FUNCTION__ << errMsgBuf << std::endl;
        printf("%s\n", errMsgBuf);
        return false;
    }
}

 

 

大致分爲以下四步

第一步,編譯正則表達式。通過調用regcomp完成,參數分別是存放編譯後的正則表達式的結構指針, 正則表達式源字符串,以及編譯正則表達式參數;

第二步,匹配字符串。調用regexec,這個函數的參數比較多一些,分別是,編譯後的正則表達式指針,被匹配字符串,存儲匹配結果的數組大小,以及存儲匹配結果的數組,和匹配規則參數;

第三步,引用匹配結果,通過遍歷存儲匹配結果的數組可得;

第四步,釋放編譯後的正則表達式,通過調用regfree,其參數即是編譯後的正則表達式指針。

 

如果,在執行編譯,比較的過程中,出現了錯誤,可以調用regerror來獲取錯誤原因。

發佈了34 篇原創文章 · 獲贊 11 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章