专家教您如何在c语言中巧用正则表达式_第1页
专家教您如何在c语言中巧用正则表达式_第2页
专家教您如何在c语言中巧用正则表达式_第3页
专家教您如何在c语言中巧用正则表达式_第4页
专家教您如何在c语言中巧用正则表达式_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

如果用户熟悉 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+pmatch0.rm_so 到 string+pmatch0.rm_eo 是第一个匹配的字符串,而从 string+pmatch1.rm_so 到 string+pmatch1.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 #include #include /* 取子串的函数 */ static char* substr(const char*str, unsigned start, unsigned end) unsigned n = end - start; static char stbuf256; strncpy(stbuf, str + start, n); stbufn = 0; return stbuf; /* 主程序 */ int main(int argc, char* argv) char * pattern; int x, z, lno = 0, cflags = 0; char ebuf128, lbuf256; regex_t reg; regmatch_t pm10; const size_t nmatch = 10; /* 编译正则表达式*/ pattern = argv1; z = regcomp(?, pattern, cflags); if (z != 0) regerror(z, ?, 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 /* 对每一行应用正则表达式进行匹配 */ 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; /* 输出处理结果 */ for (x = 0; x $0=regex 0027: regex_t reg; $0=regex 0054: z

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论