热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linuxc与正则表达式blog.sina.com.cn/s/blog_62b8329101010dpu.html

linuxc与正则表达式(2012-07-0410:40:12)转载▼标签:正则表达式数据结构字符串函数库linuxC分类:shellC中

linux c与正则表达式

(2012-07-04 10:40:12)
转载


标签:

正则表达式

数据结构

字符串

函数库

linux

C

分类:shell


C中的正则表达式如何实现呢,以regex系列函数来简要说明:

标准的linux c与c++不支持正则表达式;
以POSIX函数库中的Regex系列函数来说明在Linux c下如何使用正则表达式:

1、编译正则表达式:

 Regcomp函数,生成regex_t数据结构;

  int Regcomp(regex_t*preg, const char *regex, int cflags);
  参数说明:

     preg:用来保存编译的结果; 
     regex:字符串,表示被编译的正则表达式;
     cflags:编译开关控制细节;
          REG_EXTEND代表使用扩展正则表达式模式;
          REG_ICASE表示对规则中字符串不区分大小写;
          REG_NOSUB只检查是否有符合规则的子串

2、匹配正则表达式:

    利用regcomp生成的数据结构regex_t *preg调用regexec()函数完成模式匹配:
    int regexec(
                   constregex_t *preg, 
                   const char*string, 
                   size_tmatch,
                   regmatch_tpmatch[],
                   inteflags
                   );
typedef struct {
regoff_t rm_so;
regoff_t rm_eo;
} regmatch_t;

  参数说明:

     preg:用来编译后的模式匹配数据结构regex_t常量; 
     string:字符串,表示被匹配的字符串;
     nmatch:被匹配的个数;
     pmatch:匹配的结果数组;
            rm_so表示满足规则的子串在string中的起始偏移量
            rm_eo表示满足规则的子串在string中的后续偏移量
     eflags:匹配的特性
            REG_NOTBOL 是否是第一行
            REG_NOTEOL 是否是最后一行


3、报告错误信息

size_tregerror(int errcode, const regex_t *preg, char *errbuf, size_terrbuf_size);

 参数说明:

    errcode:来自regcomp及regexec函数的错误代码; 
     preg:regcomp编译结果;
     errbuf:缓冲区的错误信息字符串;
    errbuf_size:缓存区的错误信息字符串长度; 


4、释放正则表达式:

voidregfree(regex_t *preg);

            无返回结果,释放regcomp编译的regex_t指针;



5、正则表达式实例:


#include;

#include;

#include ;

#include

 

static char* substr(constchar*str, unsigned start, unsigned end)

{

  unsigned n =end - start;

  staticchar stbuf[256];

  strncpy(stbuf, str + start, n);

  stbuf[n] = 0;

  returnstbuf;

}

 

int main(int argc, char** argv)

{

  char *pattern;

  int x, z,lno = 0, cflags = 0;

  charebuf[128], lbuf[256];

  regex_t reg;

  regmatch_t pm[10];

  const size_tnmatch = 10;

 

  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;

  }

 

  while(fgets(lbuf, sizeof(lbuf), stdin)) {

    ++lno;

    if ((z = strlen(lbuf)) >0&& lbuf[z-1] == '\n')

      lbuf[z -1] = 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 1; ++ x) {

     if (!x) printf("d: %s\n", lno, lbuf);

     printf($%d='%s'\n", x, substr(lbuf, pm[x].rm_so, pm[x].rm_eo));

    }

  }

 

  regfree(®);

  return0;

}



编译执行

 

bitwangbin@mac:~/code/c/regex > gcc regexp.c -oregexp

bitwangbin@mac:~/code/c/regex > ./regexp 'regex[a-z]*'

0003: #include ;

  $0='regex'

0020:   regex_t reg;

  $0='regex'

0037:     z =regexec(®, lbuf, nmatch, pm, 0);

  $0='regexec'




推荐阅读
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 设计模式——模板方法模式的应用和优缺点
    本文介绍了设计模式中的模板方法模式,包括其定义、应用、优点、缺点和使用场景。模板方法模式是一种基于继承的代码复用技术,通过将复杂流程的实现步骤封装在基本方法中,并在抽象父类中定义模板方法的执行次序,子类可以覆盖某些步骤,实现相同的算法框架的不同功能。该模式在软件开发中具有广泛的应用价值。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
author-avatar
戴劳力士_484
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有