热门标签 | 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


参考

推荐阅读
  • 本文旨在构建一个JavaScript函数,用于对用户输入的电子邮件地址和密码进行有效性验证。该函数将确保输入符合标准格式,并检查密码强度,以提升用户账户的安全性。通过集成正则表达式和条件判断语句,该方法能够有效防止常见的输入错误,同时提供即时反馈,改善用户体验。 ... [详细]
  • PHP正则表达式主要用于字符串的模式分割、匹配、查找及替换操作。使用正则表达式在某些简单的环境下可能效率不高,因此如何更好的使用PHP正则表达式需要综合考虑。PHP正则表达式的定义 ... [详细]
  • 说到正则表达式,网上有很多的通用的表达式,可是事实上说来,一般人的都不愿意去拿来研究,就是拿来就直接用就行了.可是,事实上,可能有些时候,项目中或公司里的实际情况不一样,得要修改一 ... [详细]
  • BZOJ4240 Gym 102082G:贪心算法与树状数组的综合应用
    BZOJ4240 Gym 102082G 题目 "有趣的家庭菜园" 结合了贪心算法和树状数组的应用,旨在解决在有限时间和内存限制下高效处理复杂数据结构的问题。通过巧妙地运用贪心策略和树状数组,该题目能够在 10 秒的时间限制和 256MB 的内存限制内,有效处理大量输入数据,实现高性能的解决方案。提交次数为 756 次,成功解决次数为 349 次,体现了该题目的挑战性和实际应用价值。 ... [详细]
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
  • Python正则表达式详解:掌握数量词用法轻松上手
    Python正则表达式详解:掌握数量词用法轻松上手 ... [详细]
  • IamcleaningtextinR.Mytexthastheform我在R中清理文本。我的文字有表格buthecouldnotavoidthesubje ... [详细]
  • Iwanttoreplaceaportionofastringthatmatchesaregexpattern.我想替换匹配正则表达式模式的字符串的一部分。Ihav ... [详细]
  • 本文主要讲述以下几个方面:  1.元字符  2.贪婪匹配  3.实例1.元字符.匹配任意一个字符,除换行符^匹配以一个字符开头的字符串‘$’ ... [详细]
  • Lucene 4.2.1入门教程之查询构造
    为什么80%的码农都做不了架构师?本文介绍了Lucene查询构造的几种方法。1.查询方式简介查询构造的方法主要有两种,第一种是Query,另外一种 ... [详细]
  • 寻找最长无重复字符的子字符串 ... [详细]
  • 本文深入探讨了 hCalendar 微格式在事件与时间、地点相关活动标记中的应用。作为微格式系列文章的第四篇,前文已分别介绍了 rel 属性用于定义链接关系、XFN 微格式增强链接的人际关系描述以及 hCard 微格式对个人和组织信息的描述。本次将重点解析 hCalendar 如何通过结构化数据标记,提高事件信息的可读性和互操作性。 ... [详细]
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • 第十三章go实现分布式网络爬虫单机版爬虫
     网络爬虫分为两类1.通用爬虫:类似于baidu,google.他们会把大量的数据挖下来,保存到自己的服务器上.用户打开跳转的时候,其实先是跳转到他们自己的服务器. 2.聚焦爬虫: ... [详细]
  •  文章目录什么是正则表达式正则表达式元字符正则表达式应用举例POSIX方括号表达式POSIX字符集列表:我们一起来学Shell-初识shell我们一起来学Shell-sh ... [详细]
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社区 版权所有