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

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>
            亚洲综合日韩中文字幕v在线| 欧美日韩成人一区二区三区| 欧美视频免费在线| 中日韩午夜理伦电影免费| 一区二区三区四区精品| 国产日韩在线一区| 欧美成人r级一区二区三区| 欧美大色视频| 欧美怡红院视频| 欧美成人中文字幕在线| 亚洲欧美一区二区精品久久久| 久久精品亚洲精品| 亚洲视频福利| 久久亚洲不卡| 欧美一级在线播放| 欧美电影免费| 久久精品噜噜噜成人av农村| 欧美福利视频在线| 久久精品一二三| 欧美视频在线不卡| 欧美国产91| 国产人妖伪娘一区91| 亚洲精品小视频| 亚洲第一网站免费视频| 亚洲一本视频| 一区二区三区精品久久久| 久久久精品五月天| 小黄鸭视频精品导航| 欧美日韩不卡视频| 欧美国产三区| 极品日韩av| 欧美在线视频在线播放完整版免费观看 | 久久综合色播五月| 欧美一区二区视频观看视频| 欧美日韩亚洲一区三区| 亚洲国产精品va在看黑人| 国产精品一区二区黑丝| 日韩视频免费在线观看| 亚洲乱亚洲高清| 久久亚洲国产精品日日av夜夜| 欧美伊人久久| 国产精品久久看| 亚洲天堂网站在线观看视频| 在线亚洲精品| 欧美日韩三级| 亚洲精品视频一区| 一本色道久久综合亚洲精品不| 免费观看一级特黄欧美大片| 嫩草成人www欧美| 在线不卡欧美| 久久蜜桃资源一区二区老牛| 久久五月婷婷丁香社区| 今天的高清视频免费播放成人| 欧美一区二区在线播放| 久久久91精品| 欧美华人在线视频| 欧美精品综合| 亚洲欧美日本视频在线观看| 欧美日韩国产一区精品一区| 亚洲人成7777| 亚洲天堂成人| 国产精品亚洲综合色区韩国| 亚洲无线一线二线三线区别av| 亚洲欧美国产三级| 国产精品一区二区视频| 欧美伊久线香蕉线新在线| 久久久亚洲精品一区二区三区 | 欧美成人免费观看| 亚洲激情偷拍| 欧美日本免费一区二区三区| 一区二区三区精品| 欧美一二三区精品| 韩日欧美一区二区| 欧美.日韩.国产.一区.二区| 亚洲精品中文字幕女同| 午夜精品久久久久久| 国产一区二区在线观看免费| 久久夜色精品国产噜噜av| 亚洲人成人一区二区三区| 性欧美超级视频| 136国产福利精品导航网址| 欧美精品乱码久久久久久按摩| 国产精品99久久久久久白浆小说| 久久精品国产亚洲aⅴ| 亚洲国产日韩欧美综合久久| 欧美日韩不卡合集视频| 欧美在线播放一区二区| 亚洲国产精选| 欧美在线www| 在线欧美影院| 国产精品porn| 老牛嫩草一区二区三区日本| 夜夜嗨网站十八久久| 美女精品在线观看| 亚洲一区二区三区四区视频| 蜜桃av一区二区在线观看| 夜夜嗨av色一区二区不卡| 午夜一区在线| 亚洲最新在线| 韩国福利一区| 欧美肉体xxxx裸体137大胆| 久久精品国产69国产精品亚洲| 亚洲国产欧美另类丝袜| 欧美一区二区三区的| 亚洲精品欧洲| 国产一区二区观看| 欧美日韩在线视频首页| 麻豆成人在线| 欧美一区二区三区视频在线 | 欧美视频观看一区| 久久性天堂网| 午夜精品影院| 在线一区二区日韩| 亚洲国产精品va| 老色批av在线精品| 欧美一区二区三区婷婷月色 | 免费观看日韩| 久久精品三级| 午夜精品久久久久久99热软件| 亚洲精品在线电影| 欧美高清视频在线播放| 欧美丰满高潮xxxx喷水动漫| 欧美成人国产一区二区| 久久国产直播| 午夜视频一区二区| 一区二区日韩| avtt综合网| 亚洲老司机av| 亚洲人成网在线播放| 乱码第一页成人| 久久亚洲国产成人| 久久不射2019中文字幕| 欧美一级二级三级蜜桃| 欧美三级免费| 宅男噜噜噜66一区二区| 99国产精品久久久久久久久久| 久久国产88| 欧美午夜一区| 久久久久中文| 久久视频精品在线| 欧美一区二区高清| 免费国产自线拍一欧美视频| 国产综合精品一区| 另类图片国产| 国产精品久久波多野结衣| 久久精品视频网| 欧美一级片在线播放| 亚洲欧洲一二三| 亚洲乱码国产乱码精品精天堂| 欧美日韩黄色大片| 午夜伦理片一区| 亚洲午夜久久久久久尤物| 亚洲国产片色| 欧美伊人精品成人久久综合97 | 久久国产精品一区二区| 夜夜嗨网站十八久久| 欧美日韩色一区| 国产精品福利av| 国产精品久久9| 国产乱码精品一区二区三区忘忧草| 国产精品手机视频| 国一区二区在线观看| 亚洲激情视频网| 在线综合亚洲| 欧美在线高清视频| 美女视频一区免费观看| 亚洲高清久久网| 999亚洲国产精| 亚洲欧美日韩人成在线播放| 久久精品国内一区二区三区| 欧美mv日韩mv亚洲| 国产精品进线69影院| 国内精品久久久久久久果冻传媒| 亚洲国产日韩一级| 亚洲综合清纯丝袜自拍| 久久久亚洲精品一区二区三区| 亚洲第一精品影视| 亚洲与欧洲av电影| 美国十次了思思久久精品导航| 欧美人与性动交cc0o| 国产女人18毛片水18精品| 亚洲国产精品电影在线观看| 亚洲一区在线免费观看| 在线观看av不卡| 久久久久女教师免费一区| 欧美精品999| 国产日韩精品一区二区三区在线| 韩国成人精品a∨在线观看| 一本久道综合久久精品| 久久视频这里只有精品| 日韩视频免费观看| 久久深夜福利| 国产精品一区久久久久| 亚洲人妖在线| 亚洲黄色小视频| 老色鬼精品视频在线观看播放| 在线一区二区三区四区五区| 黄色av成人| 国产精品国产馆在线真实露脸| 久久不射电影网|