亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C語言正則表達式詳解 regcomp() regexec() regfree()用法詳解

2020-05-23 13:31:01
字體:
來源:轉載
供稿:網友

標準的C和C++都不支持正則表達式,但有一些函數庫可以輔助C/C++程序員完成這一功能,其中最著名的當數Philip Hazel的Perl-Compatible Regular Expression庫,許多Linux發行版本都帶有這個函數庫。
C語言處理正則表達式常用的函數有regcomp()、regexec()、regfree()和regerror(),一般分為三個步驟,如下所示:

C語言中使用正則表達式一般分為三步:
  1. 編譯正則表達式 regcomp()
  2. 匹配正則表達式 regexec()
  3. 釋放正則表達式 regfree()

下邊是對三個函數的詳細解釋

1、int regcomp (regex_t *compiled, const char *pattern, int cflags)

這個函數把指定的正則表達式pattern編譯成一種特定的數據格式compiled,這樣可以使匹配更有效。函數regexec 會使用這個數據在目標文本串中進行模式匹配。執行成功返回0。  

參數說明:

①regex_t 是一個結構體數據類型,用來存放編譯后的正則表達式,它的成員re_nsub 用來存儲正則表達式中的子正則表達式的個數,子正則表達式就是用圓括號包起來的部分表達式。
②pattern 是指向我們寫好的正則表達式的指針。
③cflags 有如下4個值或者是它們或運算(|)后的值:
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,則默認情況下是忽略換行符的,也就是把整個文本串當作一個字符串處理。執行成功返回0。
regmatch_t 是一個結構體數據類型,在regex.h中定義:

typedef struct
{
regoff_t rm_so;
regoff_t rm_eo;
} regmatch_t;

成員rm_so 存放匹配文本串在目標串中的開始位置,rm_eo 存放結束位置。通常我們以數組的形式定義一組這樣的結構。因為往往我們的正則表達式中還包含子正則表達式。數組0單元存放主正則表達式位置,后邊的單元依次存放子正則表達式位置。

參數說明:

①compiled 是已經用regcomp函數編譯好的正則表達式。
②string 是目標文本串。
③nmatch 是regmatch_t結構體數組的長度。
④matchptr regmatch_t類型的結構體數組,存放匹配文本串的位置信息。
⑤eflags 有兩個值
REG_NOTBOL 按我的理解是如果指定了這個值,那么'^'就不會從我們的目標串開始匹配??傊业浆F在還不是很明白這個參數的意義;
REG_NOTEOL 和上邊那個作用差不多,不過這個指定結束end of line。

3. void regfree (regex_t *compiled)

當我們使用完編譯好的正則表達式后,或者要重新編譯其他正則表達式的時候,我們可以用這個函數清空compiled指向的regex_t結構體的內容,請記住,如果是重新編譯的話,一定要先清空regex_t結構體。

4. size_t regerror (int errcode, regex_t *compiled, char *buffer, size_t length)

當執行regcomp 或者regexec 產生錯誤的時候,就可以調用這個函數而返回一個包含錯誤信息的字符串。

參數說明:
①errcode 是由regcomp 和 regexec 函數返回的錯誤代號。
②compiled 是已經用regcomp函數編譯好的正則表達式,這個值可以為NULL。
③buffer 指向用來存放錯誤信息的字符串的內存空間。
④length 指明buffer的長度,如果這個錯誤信息的長度大于這個值,則regerror 函數會自動截斷超出的字符串,但他仍然會返回完整的字符串的長度。所以我們可以用如下的方法先得到錯誤字符串的長度。

size_t length = regerror (errcode, compiled, NULL, 0);

下邊是一個匹配Email例子,按照上面的三步就可以。

C語言,正則表達式

下面的程序負責從命令行獲取正則表達式,然后將其運用于從標準輸入得到的每行數據,并打印出匹配結果。

#include <stdio.h>#include <sys/types.h>#include <regex.h>/* 取子串的函數 */static char* substr(const char*str,unsigned start, unsigned end){ unsigned n = end - start; static char stbuf[256]; strncpy(stbuf, str + start, n); stbuf[n] = 0; return stbuf;}/* 主程序 */int main(int argc, char** argv){ char * pattern; int x, z, lno = 0, cflags = 0; char ebuf[128], lbuf[256]; regex_t reg; regmatch_t pm[10]; const size_t nmatch = 10; /* 編譯正則表達式*/ pattern = argv[1]; z = regcomp(?, pattern, cflags); if (z != 0){  regerror(z, ?, ebuf, sizeof(ebuf));  fprintf(stderr, "%s: pattern '%s' /n",ebuf, pattern);  return 1; } /* 逐行處理輸入的數據 */ while(fgets(lbuf, sizeof(lbuf), stdin)) {  ++lno;  if ((z = strlen(lbuf)) > 0 && lbuf[z-1] == '/n')  lbuf[z - 1] = 0;  /* 對每一行應用正則表達式進行匹配 */  z = regexec(?, lbuf, nmatch, pm, 0);  if (z == REG_NOMATCH) continue;  else if (z != 0) {   regerror(z, ?, ebuf, sizeof(ebuf));   fprintf(stderr, "%s: regcom('%s')/n", ebuf, lbuf);   return 2;  }  /* 輸出處理結果 */  for (x = 0; x < nmatch && pm[x].rm_so != -1; ++ x)  {   if (!x) printf("%04d: %s/n", lno, lbuf);   printf(" $%d='%s'/n", x, substr(lbuf, pm[x].rm_so, pm[x].rm_eo));  } } /* 釋放正則表達式 */ regfree(?); return 0;}

執行下面的命令可以編譯并執行該程序:

# gcc regexp.c -o regexp# ./regexp 'regex[a-z]*' < regexp.c0003: #include <regex.h>$0='regex'0027: regex_t reg;$0='regex'0054: z = regexec(?, lbuf, nmatch, pm, 0);$0='regexec'

小結:對那些需要進行復雜數據處理的程序來說,正則表達式無疑是一個非常有用的工具。本文重點在于闡述如何在C語言中利用正則表達式來簡化字符串處理,以便在數據處理方面能夠獲得與Perl語言類似的靈活性。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91免费欧美精品| 国产精品高清在线| 国产大片精品免费永久看nba| 日韩成人黄色av| 精品国内自产拍在线观看| 欧美综合在线第二页| 亚洲欧美激情一区| 91av福利视频| 亚洲成人精品久久| 国产亚洲精品日韩| 亚洲香蕉av在线一区二区三区| 欧美精品videosex性欧美| 久久久久久久爱| 久久久久久久久爱| 日韩在线观看电影| 91老司机精品视频| 国自在线精品视频| 777国产偷窥盗摄精品视频| 精品久久久久久久久久久久| 最近的2019中文字幕免费一页| 亚洲jizzjizz日本少妇| 国产精品成熟老女人| 久久久精品电影| 亚洲成人久久一区| 久久精视频免费在线久久完整在线看| 色综合色综合久久综合频道88| 日韩免费电影在线观看| 日韩免费在线电影| 久久av中文字幕| 国产va免费精品高清在线| 亚洲精品一区二区三区婷婷月| 国产精品久久久久久久av电影| 亚洲欧美精品伊人久久| 亚洲日韩中文字幕在线播放| 国产91成人video| 亚洲国产又黄又爽女人高潮的| 亚洲白拍色综合图区| 久久久99久久精品女同性| 亚洲成人网在线观看| 国产精品第8页| 国产一区二区成人| 日韩在线播放视频| 亚洲人成电影在线观看天堂色| 久久人人爽亚洲精品天堂| 久久99青青精品免费观看| 亚洲人免费视频| 97婷婷涩涩精品一区| 精品亚洲精品福利线在观看| xxav国产精品美女主播| 欧美整片在线观看| 欧美性猛交xxxx乱大交3| 亚洲国产精品成人精品| 精品香蕉在线观看视频一| 精品国产鲁一鲁一区二区张丽| 国产精品一区=区| 91色精品视频在线| 亚洲国产精品免费| 国产一区二区三区在线播放免费观看| 精品国产福利在线| 欧美性极品少妇精品网站| 久久成人精品电影| 亚洲影视九九影院在线观看| 成人在线小视频| 最近2019中文字幕在线高清| 日韩中文字幕在线免费观看| 亚洲色图17p| 国产91亚洲精品| 91久久精品日日躁夜夜躁国产| 欧美限制级电影在线观看| www.色综合| 国产精品ⅴa在线观看h| 国产日韩在线播放| 亚洲国产精品久久久久| 91色视频在线导航| 中文字幕v亚洲ⅴv天堂| 亚洲成人久久久久| 国产ts人妖一区二区三区| 成人精品一区二区三区电影免费| 久久人人爽人人爽人人片亚洲| 欧美高清视频一区二区| 欧美另类99xxxxx| 亚洲日韩第一页| 狠狠躁天天躁日日躁欧美| 欧美一级片一区| 日韩精品视频在线免费观看| 中文字幕亚洲一区二区三区五十路| 日韩在线免费高清视频| 久久不射热爱视频精品| 欧美大片免费观看在线观看网站推荐| 亚洲qvod图片区电影| 91在线观看免费高清| 久久韩国免费视频| 91在线色戒在线| 日韩黄色高清视频| 国内精品久久久久久久久| 主播福利视频一区| 成人在线免费观看视视频| 91国自产精品中文字幕亚洲| 夜夜狂射影院欧美极品| 亚洲a成v人在线观看| 中文字幕欧美精品在线| 亚洲成人黄色网址| 国产一区二区美女视频| 国内精品久久久久| 亚洲国产精品人久久电影| 最近2019年手机中文字幕| 欧美性高潮在线| 性欧美在线看片a免费观看| 日韩性生活视频| 久久久精品网站| 国产成人综合精品| 亚洲精品中文字幕有码专区| 国产精品国产亚洲伊人久久| 黑人巨大精品欧美一区免费视频| 国内精品小视频| 亚洲精选一区二区| 欧美俄罗斯乱妇| 狠狠久久五月精品中文字幕| 日韩男女性生活视频| 国产日韩欧美日韩大片| 日本三级韩国三级久久| 国产视频欧美视频| 日韩黄色av网站| 日韩av电影在线网| 久久久久久久久久国产精品| 亚洲国产成人av在线| 日韩精品一区二区视频| 亚洲精品成人网| 欧美国产日韩一区二区| 国产精品自产拍在线观看| 国产成人在线播放| 欧美性猛交xxxx富婆| 亚洲国产女人aaa毛片在线| 日韩精品日韩在线观看| 国产视频精品在线| 一区二区在线视频| 精品精品国产国产自在线| 亚洲香蕉成视频在线观看| 高清欧美电影在线| 97在线日本国产| 国产极品精品在线观看| 亚洲成人av在线| 亚洲国产小视频在线观看| 国产精品中文字幕久久久| 中文字幕自拍vr一区二区三区| 久久成人av网站| 欧美在线视频一区| 成人综合网网址| 国产一区二区三区日韩欧美| www日韩中文字幕在线看| 91九色单男在线观看| 自拍偷拍亚洲一区| 亚洲视频欧美视频| 欧美麻豆久久久久久中文| 欧美大片在线看免费观看| 欧美日韩国产成人| 国产精品吹潮在线观看| 国产成人97精品免费看片| 欧美老肥婆性猛交视频| 国产精品成人一区二区三区吃奶| 97精品一区二区视频在线观看| 亚洲人成77777在线观看网| 最近2019免费中文字幕视频三| 亚洲肉体裸体xxxx137|