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

首頁 > 編程 > C > 正文

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

2020-01-26 13:43:42
字體:
來源:轉載
供稿:網友

標準的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 按我的理解是如果指定了這個值,那么'^'就不會從我們的目標串開始匹配。總之我到現在還不是很明白這個參數的意義;
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例子,按照上面的三步就可以。

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

#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
中文字幕一区日韩电影| 2018国产精品视频| 成人免费观看网址| 91精品久久久久久久久久久| 亚洲欧美激情精品一区二区| 在线视频日本亚洲性| 亚洲人午夜精品| 亚洲欧美精品中文字幕在线| 亚洲精品第一国产综合精品| 国产激情999| 米奇精品一区二区三区在线观看| 中文字幕国产亚洲2019| 欧美成年人视频网站| 成人一区二区电影| 人九九综合九九宗合| 91精品视频在线免费观看| 神马久久久久久| 欧美激情一区二区三区在线视频观看| 欧美精品亚州精品| 久久精品一区中文字幕| 中文.日本.精品| 日韩av免费一区| 国产精品无av码在线观看| 久久久久久高潮国产精品视| 91精品国产91久久久久久吃药| 热门国产精品亚洲第一区在线| 国产精品99蜜臀久久不卡二区| 中文在线不卡视频| 亚洲欧美日韩爽爽影院| 亚洲性视频网址| 亚洲最大成人网色| 欧美成人三级视频网站| 91亚洲永久免费精品| 欧美激情成人在线视频| 亚洲欧美国产日韩天堂区| 国产精品专区h在线观看| 日韩极品精品视频免费观看| 成人精品一区二区三区电影黑人| 国产精品亚洲自拍| 国产精品96久久久久久又黄又硬| 国产精品流白浆视频| 91国产一区在线| 国产美女久久精品香蕉69| 国产精品视频一| 韩国v欧美v日本v亚洲| 亚洲国产精品va在看黑人| 国产欧美在线视频| 日韩欧美亚洲成人| 久久精品国产电影| 日韩av免费网站| 在线精品播放av| 亚洲人成网站在线播| 久久久综合免费视频| 亚洲人成网站777色婷婷| 久久精品国产视频| 成人夜晚看av| 亚洲成人精品av| 国产精品7m视频| 91久久嫩草影院一区二区| 亚洲欧美日韩直播| 久久久国产精品免费| 国产日韩精品电影| 成人网页在线免费观看| 欧美高清无遮挡| 日韩欧美亚洲综合| 久久久久久久久久久久久久久久久久av| 亚洲区一区二区| 国产精品av在线播放| 黄色精品一区二区| 亚洲精品自拍第一页| 日韩免费在线视频| 日韩精品福利网站| 日韩视频亚洲视频| 91色视频在线观看| 亚洲精品成a人在线观看| 欧美日韩在线看| 日韩av免费网站| 91国产美女视频| 午夜剧场成人观在线视频免费观看| 成人免费淫片aa视频免费| 亚洲人精选亚洲人成在线| 久久久久久久久电影| 亚洲福利在线播放| 成人激情免费在线| 日韩欧美在线视频日韩欧美在线视频| 国产精品久久久久久久久久三级| 一区二区三区无码高清视频| 成人天堂噜噜噜| 国产精品永久免费视频| 国产精品亚洲网站| 亚洲国产99精品国自产| 国产精品视频一区国模私拍| 亚洲国产精品va在线看黑人动漫| 欧美激情一区二区三区高清视频| 亚洲无亚洲人成网站77777| 日韩av片电影专区| 欧美日韩爱爱视频| 久久久久国产精品免费网站| 欧美日韩一区二区免费在线观看| 日韩在线精品视频| 日韩国产一区三区| 91影院在线免费观看视频| 色青青草原桃花久久综合| 69影院欧美专区视频| 国产精品高清免费在线观看| 日韩高清有码在线| 欧美理论片在线观看| 亚洲大胆人体在线| 亚洲欧美成人精品| 日韩在线免费观看视频| 成人激情视频在线| 亚洲欧美精品一区二区| 热久久美女精品天天吊色| 欧美性videos高清精品| 国产日韩欧美夫妻视频在线观看| 国产成人亚洲综合91| 91精品免费久久久久久久久| 国产男女猛烈无遮挡91| 亚洲一区二区在线| 精品日韩视频在线观看| 97精品免费视频| 欧美亚洲国产另类| 97视频在线观看网址| 久久久精品免费| 色一情一乱一区二区| 亚洲资源在线看| 亚洲第一福利视频| 国语自产偷拍精品视频偷| 欧美专区第一页| 国产精品青草久久久久福利99| www.欧美精品一二三区| 亚洲精品456在线播放狼人| 国产精品v片在线观看不卡| 亚洲精品一区二区三区不| 国产精品人人做人人爽| 久久久av电影| 国产精品入口夜色视频大尺度| 亚洲а∨天堂久久精品9966| 激情久久av一区av二区av三区| 国产精品av网站| 伊人久久大香线蕉av一区二区| 欧美极品欧美精品欧美视频| 国产精品极品美女粉嫩高清在线| 欧美性一区二区三区| 高清视频欧美一级| 在线精品91av| 日韩欧美一区二区三区| 亚洲欧美日韩天堂| 中文在线资源观看视频网站免费不卡| 亚洲aaaaaa| 日韩激情在线视频| 成人性生交大片免费看视频直播| 久久的精品视频| 裸体女人亚洲精品一区| 揄拍成人国产精品视频| 午夜精品美女自拍福到在线| 夜夜嗨av色一区二区不卡| 欧美成人网在线| 高跟丝袜一区二区三区| 亚洲国产日韩欧美综合久久| 精品国产31久久久久久| 国产丝袜精品视频| 91国偷自产一区二区三区的观看方式| 色妞在线综合亚洲欧美|