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

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

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

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

標準的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語言,正則表達式,regcomp(),regexec,regfree

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

#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|九色| 日韩在线观看网址| 草民午夜欧美限制a级福利片| 亚洲在线免费观看| 欧美日韩性视频在线| 4438全国亚洲精品在线观看视频| 伊人精品在线观看| 九九精品在线观看| 黑人巨大精品欧美一区免费视频| 欧美视频在线视频| 91久久精品在线| 国产精品男女猛烈高潮激情| 免费91在线视频| 国产va免费精品高清在线观看| 91免费在线视频| 国产精品福利片| 日韩欧美国产激情| 岛国av午夜精品| 日韩免费在线电影| 亚洲一区二区三区香蕉| 国产91在线播放九色快色| 亚洲无限乱码一二三四麻| 欧美日本黄视频| 国产精品扒开腿做爽爽爽的视频| 亚洲人成网站777色婷婷| 久久国产精品久久国产精品| 精品久久久91| 亚洲久久久久久久久久| 亚洲视频网站在线观看| 国产999视频| 亚洲人成电影在线播放| 精品国产成人av| 亚洲aa中文字幕| 欧洲成人在线视频| 国产亚洲精品久久久久久牛牛| 国产美女搞久久| 亚洲国产精品人人爽夜夜爽| 国产99久久精品一区二区| 久久久久久久久久久亚洲| 欧美又大又硬又粗bbbbb| 亚洲第一福利视频| 日韩国产中文字幕| 日韩国产高清污视频在线观看| 国产黑人绿帽在线第一区| 全亚洲最色的网站在线观看| 国产精品激情av电影在线观看| 久久在线精品视频| 精品国产乱码久久久久久虫虫漫画| 国内自拍欧美激情| 亚洲国产日韩欧美在线图片| 97成人精品视频在线观看| 国产香蕉97碰碰久久人人| 搡老女人一区二区三区视频tv| 国产精品偷伦视频免费观看国产| 国产精品久久久久999| 色综合久久88色综合天天看泰| 国产成人免费av电影| 2018中文字幕一区二区三区| 亚洲电影在线看| 精品中文字幕视频| 日本韩国欧美精品大片卡二| 久久久久久久久久久久久久久久久久av| 中文字幕视频在线免费欧美日韩综合在线看| 一本色道久久88亚洲综合88| 日韩美女主播视频| 日本三级韩国三级久久| 久久在精品线影院精品国产| 中文字幕亚洲自拍| 国产精品专区第二| 日韩免费在线视频| 亚洲国产精品免费| 欧美大码xxxx| 国产原创欧美精品| 亚洲美腿欧美激情另类| 亚洲精品98久久久久久中文字幕| 日韩动漫免费观看电视剧高清| 久久精品国产99国产精品澳门| 性欧美在线看片a免费观看| 精品小视频在线| 国产精品三级久久久久久电影| 亚洲美女性生活视频| 日韩视频一区在线| 亚洲福利影片在线| 久久在线免费观看视频| www.午夜精品| 国产午夜精品麻豆| 久久久精品国产网站| 日韩av免费网站| 欧美丝袜一区二区| 久久久国产精品一区| 91色视频在线观看| 亚洲白拍色综合图区| 98精品在线视频| 国产精品三级在线| 久久亚洲欧美日韩精品专区| 激情成人在线视频| 亚洲男人天堂九九视频| 日本精品久久电影| 在线一区二区日韩| 国产精品午夜一区二区欲梦| 91精品久久久久久久久久久久久| 国产精品久久久久久久美男| 中文字幕亚洲一区在线观看| 亚洲天堂2020| 国产日韩欧美在线看| 日韩性生活视频| 欧美激情精品久久久久久大尺度| 国产有码在线一区二区视频| 大荫蒂欧美视频另类xxxx| 亚洲高清一二三区| 国产精品精品视频| 8090理伦午夜在线电影| 精品成人av一区| 九九热视频这里只有精品| 狠狠躁夜夜躁人人爽天天天天97| 美女视频黄免费的亚洲男人天堂| 亚洲男人天堂九九视频| 国产在线视频欧美| 国产精品久久久久久久久久久不卡| 国产97人人超碰caoprom| 欧美日韩一二三四五区| 久久国产精品久久久| www.国产精品一二区| 精品中文字幕视频| 国模精品系列视频| 久久国产精品影视| 日韩成人在线视频网站| 欧美久久精品午夜青青大伊人| 国产精品久久久久久久久男| 亚洲码在线观看| 美女久久久久久久久久久| 欧美日韩在线看| 欧美一级片在线播放| 国产精品一二区| 亚洲国产日韩欧美在线99| 亚洲在线免费观看| 亚洲综合视频1区| 亚洲欧美日韩综合| 国产精品99导航| 国产男人精品视频| 久久久久久国产免费| 国产男女猛烈无遮挡91| 日韩动漫免费观看电视剧高清| 国产日韩在线播放| 欧美午夜激情在线| 日韩中文字幕视频| 91av在线播放| 国产精品视频导航| 国产剧情日韩欧美| 欧美性猛交xxxxx水多| 中文字幕精品影院| 91夜夜未满十八勿入爽爽影院| 国产精品美女视频网站| 亚洲精品国产suv| 久久av在线播放| 欧美性xxxxx极品娇小| 亚洲男人天堂2023| 亚洲爱爱爱爱爱| 中文字幕视频在线免费欧美日韩综合在线看| 日韩电影免费观看中文字幕| 欧美黄网免费在线观看| 久久久久久久久国产| 亚洲精品福利免费在线观看|