linux C正则表达式

在网上找到的一个程序

[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); //如果编译成功返回0,其它返回说明有错误产生

      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;

//取得读取字符串的长度,并判断字符串结尾字符是否为回车符'/n'。如果是,将结尾字符改为0

            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;

}

[/c]

但是我发现有些正则表达式式却不能很好匹配

例如 文件a中

aadsdfs

asdfasz

adf中adfas

中国adfasd

lskdfo中国

如果用“[a-y]*"就不能匹配“中国adfasd"

 

还在研究中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值