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

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>
            免费人成网站在线观看欧美高清| 老司机一区二区三区| 国产精品人人爽人人做我的可爱 | 亚洲日本成人女熟在线观看| 欧美激情91| 亚洲肉体裸体xxxx137| av成人免费观看| 亚洲永久免费av| 久久综合狠狠| 欧美午夜无遮挡| 国产欧美一区二区在线观看| 国产亚洲美州欧州综合国| 亚洲国产高清视频| 亚洲一区二区精品| 久久全球大尺度高清视频| 欧美激情1区| 亚洲摸下面视频| 另类综合日韩欧美亚洲| 欧美日韩中文在线观看| 国产在线日韩| 亚洲视频精选在线| 久久久夜精品| 一区二区三区视频在线播放| 久久都是精品| 欧美日韩直播| 亚洲欧洲日本国产| 久久岛国电影| av成人手机在线| 欧美大片免费久久精品三p| 国产日产欧美一区| 一区二区冒白浆视频| 免费久久99精品国产自在现线| 免费成人美女女| 国产精品视频yy9099| 好吊色欧美一区二区三区视频| 91久久精品日日躁夜夜躁欧美 | 午夜亚洲视频| 欧美极品在线观看| 狠狠入ady亚洲精品经典电影| 亚洲一区欧美激情| 亚洲观看高清完整版在线观看| 亚洲自拍另类| 国产精品乱码| 99国产精品久久久久久久久久| 六月婷婷一区| 欧美一级久久久久久久大片| 欧美日韩亚洲网| 亚洲国内欧美| 欧美国产激情二区三区| 久久爱www久久做| 国产性猛交xxxx免费看久久| 亚洲欧美在线一区二区| 一区二区欧美在线| 欧美日韩综合精品| 日韩图片一区| 欧美黄色成人网| 久热re这里精品视频在线6| 黄色一区二区三区四区| 久久婷婷丁香| 久久嫩草精品久久久精品| 一区在线免费观看| 免费观看久久久4p| 老司机精品导航| 亚洲人成在线观看| 亚洲激情在线视频| 欧美日韩国产va另类| 亚洲视频在线二区| 亚洲尤物影院| 国内精品久久久久久 | 欧美成人tv| 亚洲日本欧美日韩高观看| 欧美激情成人在线视频| 欧美激情网友自拍| 亚洲色图制服丝袜| 亚洲欧美日本日韩| 亚洲国产岛国毛片在线| 亚洲国产另类久久久精品极度| 欧美精品一区二区三区视频| 亚洲性线免费观看视频成熟| 亚洲性色视频| 黄色成人av网| 亚洲美女一区| 国产视频一区欧美| 亚洲第一中文字幕在线观看| 欧美日本国产视频| 亚洲精品女人| 99国产精品99久久久久久| 欧美日韩在线观看一区二区| 亚洲欧美日韩在线| 久久精品人人爽| 在线中文字幕一区| 欧美亚洲一区二区三区| 亚洲福利免费| 一区二区三区欧美在线| 黄色成人av网| 夜夜嗨av色综合久久久综合网| 国产日韩欧美在线| 91久久精品国产91久久| 国产亚洲激情在线| 日韩视频一区二区三区在线播放| 国产一区欧美日韩| 这里只有精品丝袜| 亚洲国产婷婷综合在线精品| 亚洲午夜在线观看视频在线| 亚洲电影在线免费观看| av成人免费在线| 在线观看日韩一区| 一区二区三区国产盗摄| 在线观看中文字幕亚洲| 亚洲视频自拍偷拍| 亚洲精品欧美日韩专区| 久久精品99| 香蕉久久久久久久av网站| 欧美成人一区二区三区片免费| 久久久久久自在自线| 欧美色欧美亚洲另类二区| 蜜臀91精品一区二区三区| 国产日韩欧美电影在线观看| 亚洲欧洲一区二区三区| 亚洲国产欧美在线| 午夜欧美大尺度福利影院在线看| 一本久道综合久久精品| 欧美不卡在线| 亚洲大片一区二区三区| 狠狠网亚洲精品| 欧美一区二区视频免费观看| 小处雏高清一区二区三区| 欧美视频在线观看免费| 亚洲精品综合| 999在线观看精品免费不卡网站| 久久亚裔精品欧美| 久久亚洲欧洲| 国产视频精品xxxx| 亚洲欧美在线x视频| 欧美一区二区日韩一区二区| 国产精品久久久久久模特 | 久久精品国产69国产精品亚洲| 亚洲欧美精品伊人久久| 国产精品久久久久久久久久久久久 | 亚洲欧洲精品天堂一级| 另类欧美日韩国产在线| 欧美激情五月| 一区二区福利| 国产精品国产一区二区| 亚洲欧美伊人| 欧美成人一区二区三区片免费| 亚洲日本成人| 亚洲人成毛片在线播放| 欧美成人精品高清在线播放| 亚洲高清不卡av| 亚洲精品国产视频| 欧美精品网站| 中文在线不卡| 久久久高清一区二区三区| 狠狠做深爱婷婷久久综合一区| 麻豆av福利av久久av| 日韩视频一区二区在线观看 | 这里只有精品视频| 国产精品久久二区二区| 欧美一区二区日韩| 欧美成人精品三级在线观看| av成人国产| 国产欧美一区二区精品性| 久久久久9999亚洲精品| 亚洲电影免费观看高清| 亚洲午夜影视影院在线观看| 国产网站欧美日韩免费精品在线观看 | 欧美日韩国产综合一区二区| 亚洲午夜女主播在线直播| 久久精品免费| 日韩视频在线观看| 国产精品亚洲а∨天堂免在线| 久久本道综合色狠狠五月| 亚洲欧洲日本国产| 欧美在线日韩精品| 亚洲日本理论电影| 国产欧美日韩视频一区二区三区| 牛牛精品成人免费视频| 亚洲综合清纯丝袜自拍| 欧美大片免费观看| 欧美一级片久久久久久久| 91久久久久久| 韩国精品主播一区二区在线观看| 欧美激情在线播放| 久久精品二区| 亚洲欧美成人| 一区二区免费在线播放| 亚洲第一在线| 久热精品视频在线| 欧美一区二区三区婷婷月色 | 亚洲国产天堂久久综合| 国产一区二区三区电影在线观看| 欧美人与性动交cc0o| 老司机免费视频一区二区三区| 亚洲欧美日韩国产精品| 亚洲美女区一区| 亚洲第一视频网站| 欧美xxx在线观看| 久久久久欧美| 久久成人在线|