C語言使用正則表達式(常規(guī)方法)_第1頁
C語言使用正則表達式(常規(guī)方法)_第2頁
C語言使用正則表達式(常規(guī)方法)_第3頁
C語言使用正則表達式(常規(guī)方法)_第4頁
C語言使用正則表達式(常規(guī)方法)_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、C語言使用正則表達式 據(jù)說一個好的程序員是會使用DB和Regular Expression的程序員,可見兩者是多么重要。正則表達式是能極大地提高工作效率的工具,使用過Linux下各種具備RE特性的工具的人一定對此深有感觸。很多語言都支持RE,用的最多的當然是腳本,其中以perl最盛。不過,用C語言來用RE不是很多見,但是有時候也很有用,我最近也是看到別人說道這個,所以搜了一些資料加上自己的體會來說一說RE在C語言里的應用。C語言本身不具備RE特性,但是有很多庫,在Linux下你可以很方便的使用regex.h提供的庫。我先貼一段代碼展示一下RE在C語言里是怎么用的 1#include2#incl

2、ude3#include4#include5#include67intmain()89char*bematch=hhhericchd;10char*pattern=h3,10(.*).5.(.*);11charerrbuf1024;12charmatch100;13 regex_t reg;14interr,nm=10;15 regmatch_t pmatchnm;1617if(err=regcomp(®,pattern,REG_EXTENDED)0)18 regerror(err,®,errbuf,sizeof(errbuf);19printf(err:%sn,errbuf);2

3、02122 err=regexec(®,bematch,nm,pmatch,0);2324if(err=REG_NOMATCH)25printf(no matchn);26exit(-1);27elseif(err)28 regerror(err,®,errbuf,sizeof(errbuf);29printf(err:%sn,errbuf);30exit(-1);313233for(inti=0;i10&pmatchi.rm_so!=-1;i+)34intlen=pmatchi.rm_eo-pmatchi.rm_so;35if(len)36memset(match,0,sizeo

4、f(match);37memcpy(match,bematch+pmatchi.rm_so,len);38printf(%sn,match);394041return0;42我打算看看一個郵件地址是否匹配我所提供的pattern。這個郵件地址是hhhericchd patern為h3,10(.*).5.(.*)我們希望匹配一個以3個h字符接著為任意字符串(可以為空)直到遇到一個,然后接5個任意的字符和一個.號,最后再接一個字符串(可以為空),我們運行得到的結果是hhhericchdericchdcom我們發(fā)現(xiàn),這個郵件地址被匹配了,第一行輸出了,第二行和第三行分別輸出的是我們希望得到的匹配的一

5、部分,也就是在pattern中用括號括起來的部分。在這里我們還發(fā)現(xiàn),在C語言里使用RE表達式的時候和通常的UNIX一般的RE表達式有區(qū)別:第一、和()需要改成和(),因為在C語言反斜杠是轉移字符用的第二、.不需要轉義,不想UNIX的RE那樣需要.,但是?和*我沒有找到該怎么用下面貼上對以上所用函數(shù)的一些解釋regex的使用需要用到以下幾個函數(shù)。(定義在/usr/include/regex.h文件中)intregcomp(regex_t*compiled,constchar*pattern,intcflags) intregexec(regex_t*compiled,char*string,si

6、ze_tnmatch,regmatch_tmatchptr,int eflags)voidregfree(regex_t*compiled)size_tregerror(interrcode,regex_t*compiled,char*buffer,size_tlength)1.intregcomp(regex_t*compiled,constchar*pattern,intcflags)這個函數(shù)把指定的規(guī)則表達式pattern編譯成一種特定的數(shù)據(jù)格式compiled,這樣可以使匹配更有效。函數(shù)regexec會使用這個數(shù)據(jù)在目標文本串中進行模式匹配。執(zhí)行成功返回。regex_t是一個結構體數(shù)據(jù)

7、類型,用來存放編譯后的規(guī)則表達式,它的成員re_nsub用來存儲規(guī)則表達式中的子 規(guī)則表達式的個數(shù),子規(guī)則表達式就是用圓括號包起來的部分表達式。pattern是指向我們寫好的規(guī)則表達式的指針。cflags有如下4個值或者是它們或運算(|)后的值:REG_EXTENDED以功能更加強大的擴展規(guī)則表達式的方式進行匹配。REG_ICASE匹配字母時忽略大小寫。REG_NOSUB不用存儲匹配后的結果。REG_NEWLINE識別換行符,這樣$就可以從行尾開始匹配,就可以從行的開頭開始匹配。2.intregexec(regex_t*compiled,char*string,size_tnmatch,reg

8、match_tmatchptr,int eflags)當我們編譯好規(guī)則表達式后,就可以用regexec匹配我們的目標文本串了,如果在編譯規(guī)則表達式的時候沒有指定cflags的參數(shù)為REG_NEWLINE,則默認情況下是忽略換行符的,也就是把整個文本串當作一個字符串處理。執(zhí)行成功返回。regmatch_t是一個結構體數(shù)據(jù)類型,成員rm_so存放匹配文本串在目標串中的開始位置,rm_eo存放結束位置。通常我們以數(shù)組的形式定義一組這樣的結構。因為往往我們的規(guī)則表達式中還包含子規(guī)則表達式。數(shù)組0單元存放主規(guī)則表達式位置,后邊的單元依次存放子規(guī)則表達式位置。compiled是已經(jīng)用regcomp函數(shù)編譯

9、好的規(guī)則表達式。string是目標文本串。nmatch是regmatch_t結構體數(shù)組的長度。matchptrregmatch_t類型的結構體數(shù)組,存放匹配文本串的位置信息。eflags有兩個值REG_NOTBOL按我的理解是如果指定了這個值,那么就不會從我們的目標串開始匹配??傊业浆F(xiàn)在還不是很明白這個參數(shù)的意義,原文如下:Ifthisbitisset,thenthebeginning-of-lineoperatordoesntmatchthebeginningofthestring(presumably becauseitsnotthebeginningofaline).Ifnotset,

10、thenthebeginning-of-lineoperatordoesmatchthebeginning ofthestring.REG_NOTEOL和上邊那個作用差不多,不過這個指定結束endofline。3.voidregfree(regex_t*compiled)當我們使用完編譯好的規(guī)則表達式后,或者要重新編譯其他規(guī)則表達式的時候,我們可以用這個函數(shù)清空compiled指向的regex_t結構體的內容,請記住,如果是重新編譯的話,一定要先清空regex_t結構體。4.size_tregerror(interrcode,regex_t*compiled,char*buffer,size_

11、tlength)當執(zhí)行regcomp或者regexec產(chǎn)生錯誤的時候,就可以調用這個函數(shù)而返回一個包含錯誤信息的字符串。errcode是由regcomp和regexec函數(shù)返回的錯誤代號。compiled是已經(jīng)用regcomp函數(shù)編譯好的規(guī)則表達式,這個值可以為NULL。buffer指向用來存放錯誤信息的字符串的內存空間。length指明buffer的長度,如果這個錯誤信息的長度大于這個值,則regerror函數(shù)會自動截斷超出的字符串,但他仍然會返回完整的字符串的長度。所以我們可以用如下的方法先得到錯誤字符串的長度。size_tlength=regerror(errcode,compiled,NULL,0)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論