c++, 正則表達式,又稱正則表達式和正則表達式(英文:Regular ExpREssion,代碼中??s寫為regex、regexp或re)。
正則表達式使用單個字符串來描述和匹配一系列符合特定語法規(guī)則的字符串。
在C語言中,regcomp、regexec、regfree和regerror用于處理正則表達式。處理正則表達式有三個步驟:
1.編譯正則表達式regcomp;
2.匹配正則表達式,regexec;
3.釋放正則表達式。
以下是對這三個功能的詳細解釋
1、int regcomp (regex_t *compiled,const char *pattern,int cflags)
該函數將指定的正則表達式模式編譯成編譯好的特定數據格式,可以使匹配更加有效。regexec函數將使用這些數據在目標文本字符串中進行模式匹配。執(zhí)行成功并返回0。
參數描述:
(1) regex _ t是一種結構化數據類型,用于存儲編譯后的正則表達式,其成員re_nsub用于存儲正則表達式中子正則表達式的個數,子正則表達式是用括號括起來的部分表達式。
模式是指向我們編寫的正則表達式的指針。
cflags有以下四個值或其or運算(|)后的值:
REG_EXTENDED匹配一個更強大的擴展正則表達式。
匹配字母時,REG_ICASE忽略大小寫。
REG_NOSUB不需要存儲匹配的結果。
REG_NEWLINE識別換行符,這樣$可以從行尾匹配,$可以從行首匹配。
2. int regexec (regex_t *compiled, char *string, size_t nmatch, regmatch_t matchptr [], int eflags)
當我們編譯正則表達式時,我們可以用regexec匹配我們的目標文本字符串。如果在編譯正則表達式時沒有將cflags的參數指定為REG_NEWLINE,缺省情況下會忽略換行符。
也就是說,整個文本字符串被視為一個字符串。執(zhí)行成功并返回0。
Regmatch_t是一種結構數據類型,在regex.h:
typedef struct
{
regoff_t rm_so;
regoff_t rm_eo;
} regmatch_t;
成員rm_so存儲匹配文本字符串在目標字符串中的起始位置,rm_eo存儲結束位置。通常我們以數組的形式定義一組這樣的結構。因為通常我們的正則表達式也包含子正則表達式。數組0單元存儲主正則表達式的位置,
以下單元依次存儲子正則表達式的位置。
參數描述:
compiled是用regcomp函數編譯過的正則表達式。
字符串是目標文本字符串。
nmatch是regmatch_t結構數組的長度。
MatchptrregMatch _ T類型的結構數組,存儲匹配文本字符串的位置信息。
eflags有兩個值。
REG_NOTBOL按照我的理解,如果指定了這個值,那么我們不會從我們的目標字符串開始匹配??傊疫€是不太明白這個參數的含義;
REG_NOTEOL的功能和上面的一樣,但是這個指定結束于行尾。
3. void regfree (regex_t *compiled)
當我們使用編譯后的正則表達式或者重新編譯其他正則表達式時,我們可以使用這個函數清空編譯后的正則表達式指向的regex_t結構的內容。請記住,如果它被重新編譯,
確保首先清空regex_t結構。
4. size_t regerror (int errcode, regex_t *compiled, char *buffer, size_t length)
當執(zhí)行regcomp或regexec時出現錯誤時,可以調用此函數并返回包含錯誤信息的字符串。
參數描述:
errcode是regcomp和regexec函數返回的錯誤代碼。
compiled是用regcomp函數編譯過的正則表達式,該值可以為空。
buffer指向用于存儲錯誤信息的字符串的內存空間。
長度表示緩沖區(qū)的長度。如果該錯誤消息的長度大于該值,regerror函數將自動截斷超出的字符串,但它仍將返回完整字符串的長度。
所以我們可以先用下面的方法得到錯誤字符串的長度。
size_t length=regerror (errcode, compiled, NULL, 0);
關于C中處理正則表達式的方法,就分享到這里吧!
c++,以上就是本文為您收集整理的c++最新內容,希望能幫到您!更多相關內容歡迎關注。