| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 862 人关注过本帖, 1 人收藏
标题:正则表达式
只看楼主 加入收藏
fuyucao
Rank: 1
等 级:新手上路
帖 子:67
专家分:7
注 册:2011-10-17
收藏
得分:0 
回复 10楼 ggyy4k
我也知道思路啊!就是不知道怎么下手,我现在需要一个简单的完整例子,就是main函数开始的那种,要不然我都蒙了
2011-12-28 14:57
smallmoon521
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:517
专家分:1373
注 册:2008-4-21
收藏
得分:0 
想完整的写个通用正则的功能 ,不实现
针对此问题,可用楼上的思路

为游戏狂~~!!    大家努力编哈!
2011-12-29 10:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
是的,全部实现正则功能不现实,毕竟太庞大了,有现成的,单纯楼主的需要,又不想引入庞大的正则函数库,用10楼的思路就可以了,很简单的。

授人以渔,不授人以鱼。
2011-12-29 11:26
xdh0817
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:193
专家分:195
注 册:2011-10-20
收藏
得分:0 
#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);
  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);
      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;
}
  


上述程序负责从命令行获取正则表达式,然后将其运用于从标准输入得到的每行数据,并打印出匹配结果。执行下面的命令可以编译并执行该程序:  

#  gcc regexp.c -o regexp
#  ./regexp  'regex[a-z]*' < regexp.c
0003: #include <regex.h>;
  $0='regex'
0027:   regex_t reg;
  $0='regex'
0054:     z = regexec(&reg, lbuf, nmatch, pm, 0);
  $0='regexec'
  
2011-12-29 13:35
fuyucao
Rank: 1
等 级:新手上路
帖 子:67
专家分:7
注 册:2011-10-17
收藏
得分:0 
回复 10楼 ggyy4k
    int regcompx(const char* str)
    {   
        smatch what;
    //cpos = strrchr(lbody, '-');//在lbody中查找'-'最后一次出现的位置,最后返回指向'-'的指针
    if((strrchr(str, '-')))
    {
     regex expression("\w{6}-\w{6}");//正则表达式
      if(regex_search(str, what, expression))
       {
                 for(int i=0;i<what.size();i++)
            //printf("str: %s\r\n", what[i].str);
            cout<<"str: " <<what[i].str()<<endl;//cout<< " "<<endl 输出并换行 endl相当于换行
       }
    }

    else
    {

    }
    return 0;
    }
现在我的str是 009910-suosoeuioweuoewoeu,它输出的结果不应该是009910-suosoe吗?但是没有实现,什么原因,请各位帮帮忙
2011-12-29 17:59
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
收藏
得分:10 
使用队列可行不?char [13]的队列,用getc()来循环读取文件,读取的数据到队尾,删除队首的数据,这是更新一次队列。
需要每更新一次队列检测队中char[6]是否是'-',是的话就输出结果。
如果还有别的要求,比如这13个字符中只能有中间的'-',其他地方不能出现'-',那么我们就可以检测整个队列是否含有两个以上'-',如果有,那么标记最大出现'-'的下标n,而且本次作废,隔12-n次更新队列后再重新检测;如果不是,则检测char[6]是否有'-',有则输出,并且也在隔6次更新后再检测,没有则下次更新检测。(可能间隔的数据12-n和6有错误,需要实际实践)

[ 本帖最后由 stophin 于 2011-12-29 18:20 编辑 ]
2011-12-29 18:14
快速回复:正则表达式
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028027 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved