在C语言中巧用正则表达式
From:?http://blog.chinaunix.net/space.php?uid=20435679&do=blog&id=1680220
| 標(biāo)準(zhǔn)的C和C++都不支持正則表達(dá)式,但有一些函數(shù)庫可以輔助C/C++程序員完成這一功能,其中最著名的當(dāng)數(shù)Philip Hazel的Perl-Compatible Regular Expression庫,許多Linux發(fā)行版本都帶有這個(gè)函數(shù)庫。 int regcomp(regex_t *preg, const char *regex, int cflags); Param 參數(shù)regex是一個(gè)字符串,它代表將要被編譯的正則表達(dá)式; 參數(shù)preg指向一個(gè)聲明為regex_t的數(shù)據(jù)結(jié)構(gòu),用來保存編譯結(jié)果; 參數(shù)cflags決定了正則表達(dá)式該如何被處理的細(xì)節(jié)。? 如果函數(shù)regcomp()執(zhí)行成功,并且編譯結(jié)果被正確填充到preg中后,函數(shù)將返回0, 任何其它的返回結(jié)果都代表有某種錯(cuò)誤產(chǎn)生。? 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; Param 參數(shù)string是將要進(jìn)行匹配的字符串, 參數(shù)nmatch和pmatch則用于把匹配結(jié)果返回給調(diào)用程序, 參數(shù)eflags決定了匹配的細(xì)節(jié)。? Param 參數(shù)errcode 是來自函數(shù)regcomp()或regexec()的錯(cuò)誤代碼, 參數(shù)preg 是由函數(shù)regcomp()得到的編譯結(jié)果, 其目的是把格式化消息所必須的上下文提供給regerror()函數(shù)。 參數(shù)errbuf_size指明的最大字節(jié)數(shù), #include <sys/types.h> #include <regex.h> /* 取子串的函數(shù) */ 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; /* 編譯正則表達(dá)式*/ 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; } /* 逐行處理輸入的數(shù)據(jù) */ while(fgets(lbuf, sizeof(lbuf), stdin)) { ++lno; if ((z = strlen(lbuf)) > 0 && lbuf[z-1] == '\n') lbuf[z - 1] = 0; /* 對(duì)每一行應(yīng)用正則表達(dá)式進(jìn)行匹配 */ 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; } /* 輸出處理結(jié)果 */ 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)); } } /* 釋放正則表達(dá)式 */ regfree(?); return 0; } # ./regexp 'regex[a-z]*' < regexp.c 0003: #include <regex.h> $0='regex' 0027: regex_t reg; $0='regex' 0054: z = regexec(?, lbuf, nmatch, pm, 0); $0='regexec' |
總結(jié)
以上是生活随笔為你收集整理的在C语言中巧用正则表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 社区养老管理系统开发满足老年人多样化、多
- 下一篇: 配置网络测试环境的批处理