regcomp()、regexec()、regfree()和regerror()
c語言中使用正規表示式一般分為三步:
編譯正規表示式 regcomp()
匹配正規表示式 regexec()
釋放正規表示式 regfree()
標頭檔案#include
#include
函式1、int regcomp(regex_t *preg, const char *regex, int cflags);
功能:編譯給定的正規表示式。
引數說明:
1、prep:regex_t結構體資料型別,存放編譯後的正規表示式。
2、regex:指向給定的正規表示式的指標。
3、cflags:有如下4個值或者是它們或運算(|)後的值:
reg_extended 以功能更加強大的擴充套件正規表示式的方式進行匹配。
reg_icase 匹配字母時忽略大小寫。
reg_nosub 不用儲存匹配後的結果。
reg_newline 識別換行符,這樣'$'就可以從行尾開始匹配,'^'就可以從行的開頭開始匹配。
返回值:成功:0;失敗:返回:errno
2、int regexec(const regex_t *preg, const char *string, size_t nmatch,regmatch_t pmatch, int eflags);功能:利用編譯好的正規表示式,匹配目標文字串,如果在編譯正規表示式的時候沒有指定cflags的引數為
reg_newline,則預設情況下是忽略換行符的,也就是把整個文字串當作乙個字串處理。
執行成功返回0。
regmatch_t 是乙個結構體資料型別,在regex.h中定義:
typedef struct
regoff_t rm_so;
regoff_t rm_eo;
} regmatch_t;
成員rm_so 存放匹配文字串在目標串中的開始位置,rm_eo 存放結束位置。通常我們以陣列的形式定義一組這樣的結構。因為往往我們的正規表示式中還包含子正規表示式。陣列0單元存放主正規表示式位置,後邊的單元依次存放子正規表示式位置。
引數說明:
preg:用regcomp函式編譯好的正規表示式。
string:目標文字串。
nmatch:是regmatch_t結構體陣列的長度。
pmatch:regmatch_t型別的結構體陣列,存放匹配文字串的位置資訊。
eflags:有兩個值
reg_notbol 按我的理解是如果指定了這個值,那麼'^'就不會從我們的目標串開始匹配。
總之我到現在還不是很明白這個引數的意義;
reg_noteol 和上邊那個作用差不多,不過這個指定結束end of line。
返回值:成功:0;失敗:返回:errno
3、 void regfree(regex_t *preg);
功能:清空compiled指向的regex_t結構體的內容。
如果是重新編譯的話,一定要先清空regex_t結構體。
引數:pgep:regcomp函式編譯好的正規表示式。
4、size_t regerror(int errcode, const regex_t *preg, char *errbuf,
size_t errbuf_size);
功能:regcomp 或regexec 產生錯誤時,呼叫這個函式可以返回乙個包含錯誤資訊的字串。
引數說明:
errcode: regcomp 和 regexec 函式返回的錯誤代號。
preg:用regcomp函式編譯好的正規表示式,這個值可以為null。
errbuf:用來存放錯誤資訊的字串的記憶體空間。
errbuf_size:errbuf的大小。如果這個錯誤資訊的長度大於這個值,regerror 函式會自動截斷超出的字串,但他仍然會返回完整的字串的長度。所以我們可以用如下的方法先得到錯誤字串的長度。然後再來開闢對應的空間,儲存錯誤資訊。
size_t length = regerror (errcode, compiled, null, 0);
#include #include #include #include #include #include #include int main(int argc, char *ar**)view code/*匹配成功,列印匹配到的內容*/
for (int i = pmatch[0].rm_so; i < pmatch[0].rm_eo; i++)
printf("\r\n");
regfree(&preg); //清空編譯好的正規表示式
return 0;
}
C 正規表示式 匹配
有時我們需要匹配像 100 50 15 這樣的可巢狀的層次性結構 這時簡單地使用 則只會匹配到最左邊的左括號和最右邊的右括號之間的內容 這裡我們討論的是貪婪模式,懶惰模式也有下面的問題 假如原來的字串裡的左括號和右括號出現的次數不相等,比如 5 3 2 那我們的匹配結果裡兩者的個數也不會相等。有沒有...
正規表示式 匹配
字串 void abtr quint32 ab 表示乙個正規表示式 template class bidirectionaliterator class allocator std allocator sub match bidirectionaliterator class match resul...
正規表示式匹配
請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 解法 首先要想到用遞迴處理...