青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

asm, c, c++ are my all
-- Core In Computer
posts - 139,  comments - 123,  trackbacks - 0

如何在C語言中巧用正則表達式

如果用戶熟悉Linux下的sed、awk、grep或vi,那么對正則表達式這一概念肯定不會陌生。由于它可以極大地簡化處理字符串時的復雜度,因此現在已經在許多Linux實用工具中得到了應用。千萬不要以為正則表達式只是Perl、Python、Bash等腳本語言的專利,作為C語言程序員,用戶同樣可以在自己的程序中運用正則表達式。?

標準的C和C++都不支持正則表達式,但有一些函數庫可以輔助C/C++程序員完成這一功能,其中最著名的當數Philip?Hazel的Perl-Compatible?Regular?Expression庫,許多Linux發行版本都帶有這個函數庫。?

編譯正則表達式?

為了提高效率,在將一個字符串與正則表達式進行比較之前,首先要用regcomp()函數對它進行編譯,將其轉化為regex_t結構:?

int ?regcomp(regex_t? * preg,? const ? char ? * regex,? int ?cflags);?

參數regex是一個字符串,它代表將要被編譯的正則表達式;參數preg指向一個聲明為regex_t的數據結構,用來保存編譯結果;參數cflags決定了正則表達式該如何被處理的細節。?

如果函數regcomp()執行成功,并且編譯結果被正確填充到preg中后,函數將返回0,任何其它的返回結果都代表有某種錯誤產生。?

匹配正則表達式?

一旦用regcomp()函數成功地編譯了正則表達式,接下來就可以調用regexec()函數完成模式匹配:?

int ?regexec( const ??regex_t?? * preg,?? const ?? char ? * string ,?size_t?nmatch,regmatch_t?pmatch[],? int ?eflags);?

typedef?
struct ?
{?
??regoff_t?rm_so;?
??regoff_t?rm_eo;?
}
?regmatch_t;?
參數preg指向編譯后的正則表達式,參數string是將要進行匹配的字符串,而參數nmatch和pmatch則用于把匹配結果返回給調用程序,最后一個參數eflags決定了匹配的細節。?

在調用函數regexec()進行模式匹配的過程中,可能在字符串string中會有多處與給定的正則表達式相匹配,參數pmatch就是用來保存這些匹配位置的,而參數nmatch則告訴函數regexec()最多可以把多少個匹配結果填充到pmatch數組中。當regexec()函數成功返回時,從string+pmatch[0].rm_so到string+pmatch[0].rm_eo是第一個匹配的字符串,而從string+pmatch[1].rm_so到string+pmatch[1].rm_eo,則是第二個匹配的字符串,依此類推。?

釋放正則表達式?

無論什么時候,當不再需要已經編譯過的正則表達式時,都應該調用函數regfree()將其釋放,以免產生內存泄漏。?
void ?regfree(regex_t? * preg);?

函數regfree()不會返回任何結果,它僅接收一個指向regex_t數據類型的指針,這是之前調用regcomp()函數所得到的編譯結果。?

如果在程序中針對同一個regex_t結構調用了多次regcomp()函數,POSIX標準并沒有規定是否每次都必須調用regfree()函數進行釋放,但建議每次調用regcomp()函數對正則表達式進行編譯后都調用一次regfree()函數,以盡早釋放占用的存儲空間。?

報告錯誤信息?

如果調用函數regcomp()或regexec()得到的是一個非0的返回值,則表明在對正則表達式的處理過程中出現了某種錯誤,此時可以通過調用函數regerror()得到詳細的錯誤信息。?

size_t?regerror( int ?errcode,? const ?regex_t? * preg,? char ? * errbuf,?size_t?errbuf_size);?

參數errcode是來自函數regcomp()或regexec()的錯誤代碼,而參數preg則是由函數regcomp()得到的編譯結果,其目的是把格式化消息所必須的上下文提供給regerror()函數。在執行函數regerror()時,將按照參數errbuf_size指明的最大字節數,在errbuf緩沖區中填入格式化后的錯誤信息,同時返回錯誤信息的長度。?

應用正則表達式?

最后給出一個具體的實例,介紹如何在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( &
reg,?pattern,?cflags);?
??
if ?(z? != ? 0 )
{?
????regerror(z,?
& reg,?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( & reg,?lbuf,?nmatch,?pm,? 0
);?
????
if ?(z? == ?REG_NOMATCH)? continue
;?
????
else ? if ?(z? != ? 0 )?
{?
??????regerror(z,?
& reg,?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(
&
reg);?
??
return ? 0
;?
}
?

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

# ??gcc?regexp.c?-o?regexp?
#??./regexp??'regex[a-z]*'?<?regexp.c?

0003 : ? # include?<regex.h>;?
??$ 0 = ' regex ' ?
0027 :
???regex_t?reg;?
??$
0 = ' regex '
?
0054 : ?????z? = ?regexec( & reg , ?lbuf , ?nmatch , ?pm , ? 0
);?
??$
0 = ' regexec ' ?

小結?

對那些需要進行復雜數據處理的程序來說,正則表達式無疑是一個非常有用的工具。本文重點在于闡述如何在C語言中利用正則表達式來簡化字符串處理,以便在數據處理方面能夠獲得與Perl語言類似的靈活性。
posted on 2006-09-23 02:29 Jerry Cat 閱讀(320) 評論(0)  編輯 收藏 引用

<2006年9月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用鏈接

留言簿(7)

隨筆檔案

最新隨筆

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精选大片| 欧美在线视频免费播放| 久久色在线播放| 亚洲高清在线视频| 欧美电影在线观看| 另类亚洲自拍| 亚洲美女一区| 亚洲欧洲综合| 欧美国产日韩亚洲一区| 久久久久.com| 欧美在线播放一区二区| 久久久人成影片一区二区三区| 亚洲国产导航| 亚洲一区二区三区在线看| 欧美肉体xxxx裸体137大胆| 亚洲电影av在线| 香蕉成人久久| 亚洲电影免费观看高清完整版在线 | 久久国内精品自在自线400部| 国产精品黄视频| 欧美日韩一区二区三区在线视频| 一区二区三区久久| 99精品热视频| 国产精品第13页| 亚洲美女在线国产| 午夜精品999| 在线一区视频| 欧美精品www| 老司机成人网| 好看不卡的中文字幕| 在线亚洲高清视频| 99伊人成综合| 欧美高清在线视频| 欧美韩国在线| 亚洲国产毛片完整版| 老司机成人网| 欧美国产第二页| 亚洲三级性片| 欧美日韩国产不卡| 一本色道久久88综合日韩精品 | 久久久www成人免费毛片麻豆| 欧美日韩1080p| 日韩亚洲国产欧美| 久久成人在线| 亚洲国产精品成人综合色在线婷婷| 久久国产成人| 亚洲国产第一| 亚洲欧美资源在线| 激情文学综合丁香| 欧美人与性动交a欧美精品| 一区二区欧美在线| 久久人体大胆视频| 日韩亚洲综合在线| 最新日韩精品| 香蕉久久一区二区不卡无毒影院| 国产亚洲欧美一区二区三区| 美女诱惑黄网站一区| 日韩亚洲精品电影| 狂野欧美一区| 性欧美暴力猛交另类hd| 在线观看91精品国产入口| 国产精品久久久久久久久搜平片| 久久大香伊蕉在人线观看热2| 亚洲黄色av| 免费不卡在线视频| 久久动漫亚洲| 午夜亚洲福利| 亚洲欧美激情一区二区| 99精品欧美一区二区三区| 黄色一区二区三区四区| 国产精品久久久一本精品| 欧美日本乱大交xxxxx| 欧美福利专区| 欧美电影免费观看网站| 免费日韩一区二区| 久久精品国产99| 亚洲欧美中文字幕| 亚洲影视在线播放| 亚洲女爱视频在线| 一区二区三区日韩精品视频| 亚洲茄子视频| 一本久道久久综合狠狠爱| 亚洲美女电影在线| 在线午夜精品自拍| 午夜精品区一区二区三| 欧美在线你懂的| 久久久久久久999| 欧美暴力喷水在线| 欧美视频不卡| 国外成人在线视频网站| 亚洲黄色成人网| 亚洲在线日韩| 免费日本视频一区| 亚洲一二三区精品| 欧美在线观看www| 久久网站热最新地址| 亚洲国产精品一区| 亚洲淫片在线视频| 欧美国产精品v| 国产一区二区三区黄视频| 亚洲欧洲精品天堂一级| 午夜精品福利视频| 欧美福利视频网站| 一区二区三区福利| 欧美激情精品久久久久久黑人 | 久久躁狠狠躁夜夜爽| 欧美日韩xxxxx| 亚洲黄色在线视频| 久久久久久免费| 一区二区三区导航| 欧美精品一区二区三区在线看午夜| 国产精品久久久久久户外露出| 激情成人av| 免费在线国产精品| 欧美影视一区| 黑人巨大精品欧美一区二区小视频 | 狠狠久久亚洲欧美专区| 午夜视频久久久| 亚洲欧美日韩区| 国产亚洲人成a一在线v站| 午夜欧美大片免费观看| 国产精品99久久久久久久久| 欧美精品久久99| 国产精品夜夜夜| 欧美激情第3页| 欧美视频日韩视频在线观看| 欧美日韩国产高清视频| 国产精品亚洲不卡a| 欧美亚洲一区在线| 久久久另类综合| 亚洲欧洲精品一区二区三区不卡| 亚洲高清在线| 久久久久久久高潮| 欧美伊人久久久久久久久影院| 国产一区二区主播在线| 欧美wwwwww| 国产精品福利在线观看| 久久久av毛片精品| 欧美精品免费视频| 欧美一站二站| 欧美成人tv| 久久久久久久久蜜桃| 欧美精品免费看| 免费成人高清视频| 国产精品日日摸夜夜添夜夜av| 久久久免费av| 国产精品日韩一区二区三区| 亚洲国产精品高清久久久| 国产精品视频一二| 99国产一区| 99在线精品免费视频九九视| 麻豆av福利av久久av| 蜜桃av噜噜一区| 国产一区二区三区在线观看精品 | 欧美在线3区| 亚洲午夜在线观看视频在线| 欧美激情视频免费观看| 欧美高清视频一区二区三区在线观看 | 欧美成人在线免费观看| 玖玖在线精品| 悠悠资源网亚洲青| 免费的成人av| 免费国产一区二区| 亚洲国产精品久久久久秋霞影院| 久久九九精品| 亚洲国产高清一区| 亚洲精品一品区二品区三品区| 久久精品国产亚洲精品| 久久www免费人成看片高清| 国产欧美日韩一级| 久久不见久久见免费视频1| 红杏aⅴ成人免费视频| 欧美亚洲一区二区在线| 久久久爽爽爽美女图片| 樱桃国产成人精品视频| 欧美成人精精品一区二区频| 亚洲精选一区二区| 欧美亚洲在线播放| 91久久精品国产| 欧美色图麻豆| 欧美96在线丨欧| 午夜亚洲性色视频| 亚洲丁香婷深爱综合| 亚洲免费电影在线| 国产尤物精品| 欧美日韩中文字幕日韩欧美| 久久国产精品一区二区三区四区 | 亚洲美女在线观看| 欧美在线不卡| 亚洲综合色丁香婷婷六月图片| 在线欧美影院| 国产在线观看一区| 国产精品久久久久久av下载红粉 | 亚洲性人人天天夜夜摸| 一区视频在线看| 国产一二三精品| 国产精品久久国产愉拍| 欧美高清在线| 欧美日韩国产一区二区三区地区| 久久久久久久久一区二区|