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

紧急求助!如何运用正则表达式(regexp)进行高效匹配操作?

如何利用正则表达式(regexp)实现高效的模式匹配?本文探讨了正则表达式在编程中的应用,并分析了一个示例程序中存在的问题。通过具体的代码示例,指出该程序在定义和使用正则表达式时的不当之处,旨在帮助读者更好地理解和应用正则表达式技术。
如何使用regexp来进行正则表达式的匹配?
下面这个程序有何不妥,请各位打下指正:
#define INIT    register char *sp=instring;
#define GETC()  (*sp++)
#define PEEKC() (*sp)
#define UNGETC(c)   (--sp)
#define RETURN(c) return;
#define ERROR(c)    regerr()
#include 
#include 
main()
{
    char expbuf[10];
    char linebuf[80];
    strcpy(expbuf,"^[0-9]*$");
    compile((char *)0,expbuf,&expbuf[sizeof(expbuf)],'\0');
    for (;;)
    {
        printf("please input a string:\n");
        scanf("%s\n",linebuf);
        if (step(linebuf,expbuf))
        {
            printf("success!\n");
        }
        else
            printf("failed!\n");
    }
}

编译时提示regerr未定义,不知何故?希望各位大虾能以例程解答
请发email至bone_dragon@21cn.com,多谢!

5 个解决方案

#1


maybe this will help:
-----------------------------------
/*
**regtest.c: 已在linux(egcs) & solaris(gcc-2.95.2) 下调试通过
*/
#include 
#include 
main()
{
  regex_t re;
  char *expbuf="^[0-9]*$";
  char linebuf[80];
  regmatch_t pmatch[16];
 
  regcomp(&re,expbuf,0);
  for (;;){
    printf("please input a string:\n");
    scanf("%s",linebuf);
    if(0 == regexec(&re, linebuf,  16,pmatch,0))
      printf("success!\n");
    else
        printf("failed!\n");
  }
}   

#2


多谢指点,感激不尽,还有点小问题
能解释一下pmatch的作用么?

#3


pmatch用来保存匹配到的子串下标.
pmatch 是一个元素类型为regmatch_t的数组,在上例中有16个元素:
 
 typedef struct
 {
     regoff_t rm_so;
     regoff_t rm_eo;
  } regmatch_t;  

其中 rm_so 是子串首元素的下标(-1表示结束),rm_eo是子串末元素的下标加1;
pmatch[0]保存整个正则表达式的下标;
pmatch[1]保存正则表达式中第一个用"("和")"括起的部分的下标;
pmatch[2]...第二个...,

for example:
------------------------------
/* regtest2.c */

#include 
#include 
 
#define MAX_MATCH 16
 
main()
{
  int i;
  regex_t re;
  char *expbuf="(hello)[0-9]*(world)";
  char linebuf[80]="regexp_test hello123world good";
  regmatch_t pmatch[MAX_MATCH];
 
  printf("regular expression: %s\nInput string: %s\n",expbuf,linebuf);
 
  regcomp(&re,expbuf,REG_EXTENDED);
  if(0 == regexec(&re, linebuf,  MAX_MATCH,pmatch,0)){
        for(i=0;i            printf("start=%d, end=%d\n",pmatch[i].rm_so,pmatch[i].rm_eo);
  }
  else
      printf("failed!\n");
  regfree(&re);
}   
------------------------------
bash-2.04# ./regtest2
regular expression: (hello)[0-9]*(world)
Input string: regexp_test hello123world good
start=12, end=25
start=12, end=17
start=20, end=25 

#4


真想知道这个函数是怎么实现的,要是知道请不吝赐教。
开始我不知道存在这个函数,还打算写一个出来呢。
可是想来想去也没想到一个比较好的,只能通过最基本的从
上到下分析法,需要回溯,实在是麻烦的要紧。

#5


参考

推荐阅读
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • Java 中 Writer flush()方法,示例 ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
author-avatar
帕皮丝汀阿奎莱拉
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有