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

来源:互联网 发布:xp系统查找mac地址 编辑:程序博客网 时间:2024/06/06 02:43

linux c与正则表达式

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

正则表达式

数据结构

字符串

函数库

linux

分类: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<stdio.h>;

#include<sys/types.h>;

#include<regex.h>;

#include<string.h>

 

static char* substr(constchar*str, unsignedstart, 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(&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);

     return2;

    }

  

    for (x = 0; x < nmatch&& pm[x].rm_so != -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(&reg);

  return0;

}



编译执行

 

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

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

0003: #include <regex.h>;

  $0='regex'

0020:   regex_t reg;

  $0='regex'

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

  $0='regexec'


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 怪兽充电宝丢了怎么办 有已处置的评价怎么办 淘宝降权了怎么办2018 使用虚假广告词被工商查到怎么办 为什么手机淘宝店关注不了怎么办 淘宝买东西付钱后卖家不发货怎么办 微信销售群没人买东西怎么办 淘宝想开2个店铺怎么办 拼多多没钱交保证金怎么办 差评一个月后怎么办 淘宝买家投诉成立后怎么办 天猫投诉成立了怎么办 新开实体店铺没生意怎么办 新开淘宝没流量怎么办 白色板鞋有青草弄的绿色怎么办 淘宝租衣服不退押金怎么办 c盘不可以扩展怎么办 实践教学管理平台忘记账号怎么办 淘宝申请售后店家不处理怎么办 全民k歌地区限制怎么办 网络电视hdp无法下载怎么办 淘宝店铺销量为零怎么办 快递号填错卖家拒绝退款申请怎么办 淘宝店代购 售假怎么办 淘宝申请售后卖家没钱怎么办 淘宝禁止评价一个月怎么办 被卖家电话骚扰怎么办 恶意骚扰扣12分怎么办 新店开张交保证金被骗了怎么办 支付宝蚂蚁花呗逾期怎么办 被注销的微信怎么办 花呗有些不能用怎么办 实体店生意不好做怎么办 电器实体店生意越来越差怎么办 开业第一天不吉利怎么办 美容店开业第一天没人怎么办 淘宝店铺没有人访问怎么办 淘宝店铺没有人问怎么办 淘宝申请退款后店铺关闭怎么办 宝贝详情怎么改不了怎么办 改详情页后被删除宝贝怎么办