C語言正規表示式匹配

2022-10-10 17:36:07 字數 2361 閱讀 8815

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**)

/*匹配成功,列印匹配到的內容*/

for (int i = pmatch[0].rm_so; i < pmatch[0].rm_eo; i++)

printf("\r\n");

regfree(&preg); //清空編譯好的正規表示式

return 0;

}

view code

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 均不匹配 解法 首先要想到用遞迴處理...