实现最简单的正则表达式

用C实现一个最简单的正则表达式引擎 这个实现参考了Rob Pike在《The Practice of Programming》中介绍的正则表达式引擎设计,是一个非常精简但完整的实现。 阅读详情
/*
原题:“在一篇英文文章中查找指定的人名,人名使用二十六个英文字母(可以是大写或小写)、空格以及两个通配符组成(*、?),通配符“*”表示零个或多个任意字母,通配符“?”表示一个任意字母。
如:“J* Smi??”   可以匹配“John Smith” .
请用C语言实现如下函数:”
void scan(const char* pszText, const char* pszName);

以下并未完全按要求实现,但意思到了。

GCC 4.5.2
*/

#include <cassert>
#include <iostream>
using namespace std;

char const * regexp_probe(char const * src, char const * pattern)
{
  if(!src || !pattern){
    return 0;
  }
  char c = *pattern;
  if(isalpha(c) || c == ' '){ // match: a-z, A-Z, <space>
    if(*src == c){
      if(regexp_probe(src + 1, pattern + 1)){
        return src;
      }
      else{
        return 0;
      }
    }
    else{
      return 0;
    }
  }
  else if(c == '?'){
    if(*src == 0){
      return 0;
    }
    else if(regexp_probe(src + 1, pattern + 1)){
      return src;
    }
    else{
      return 0;
    }
  }
  else if(c == '*'){
    while(1){
      if(regexp_probe(src, pattern + 1)){
        return src;
      }
      else if(*src == 0){
        return 0;
      }
      else{
        ++src;
      }
    }
  }
  else if(c == 0){ // end
    return src;
  }
  else{
    assert(false);
  }
}
char const * regexp_match(char const * src, char const * pattern)
{
  while(*src){
    if(regexp_probe(src, pattern)){
      return src;
    }
    ++src;
  }
  if(*pattern == 0){
    return src;
  }
  return 0;
}
void test(char const *src, char const *ptn)
{
  cout << "match " << "\"" << src << "\" by pattern " << "\"" << ptn << "\": " << flush;
  char const * pt = regexp_match(src, ptn);
  cout << (pt ? pt : "<mismatch>") << endl;
}
int main()
{
  test("", "");
  test("a", "");
  test("", "a");
  test("a", "a");
  test("ab", "a");
  test("ca", "a");
  test("cab", "a");
  test("cab", "a?");
  test("ca", "a?");
  test("ca", "?a");
  test("cab", "?a?");
  test("", "?");
  test("a", "?");
  test("b", "?");
  test("abc", "?");
  test("", "*");
  test("a", "*");
  test("a", "a*");
  test("a", "*a");
  test("ba", "*a");
  test("acc", "*a");
  test("bbaacc", "*a");
  test("abbaacc", "*a?cc*");
  test("abbaacc", "abba*ccc");
  test("abbaacc", "d*");
  test("abbaacc", "*d*");
  return 0;
}


正则表达式的底层实现原理是什么 参考:https://www.cnblogs.com/Renyi-Fan/p/9694695.html 正则表达式里的底层原理是什么 https://www.cnblogs.com/chanshuyi/p/9197164.html 藏在正则表达式里的陷阱 一、总结 一句话总结:简单地说,实现正则表达式引擎的有两种方式:DFA 自动机(Deterministic Final Automata 确定型有穷自动机)和NFA 自动机(Non determi... 阅读详情

相关推荐

C++代码实例:正则表达式

可以采用正则表达式来实现字符串匹配功能。一种简单的正则表达式是由英文字母(区分大小写)、数字及通配符“*”和“?”任意组合而成的。“?”代表任意一个字符,“*”代表零个或任意多个字符。例如,a*b可以匹配acb,aabb,afdfdb,ab等,但不可以匹配ac,bb,abbc;a?b可以匹配acb,abb,但不可以匹配ab,accb。试编写一个程序,从文件中读入N个字符串,再从键盘上读入任意一个合乎规则的正则表达式,例如:“a?bb*d”,输出符合正则表达式的字符串。

正则表达式-理解与实现

1、概述正则表达式,又称规则表达式(Regular Expression,在代码中常简写为regex、regexp或RE)),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个语法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。简而言之:如果遇到无法简单处理的字符串提取、替换问题,可以优先考虑正则表达式2、优点。

PythonRecord的博客 2142

EPLAN二次开发实战指南:从API接口到定制化界面

本文为EPLAN二次开发实战指南,详细介绍了从搭建C#开发环境、理解API接口到创建定制化插件的完整流程。通过实战案例,如批量修改设备属性和设计交互式界面,帮助电气工程师利用EPLAN二次开发实现工作流程自动化与深度定制,从而显著提升设计效率。

weixin_29246195的博客 804

算法设计与分析: 3-14 正则表达式匹配问题

3-14 正则表达式匹配问题 问题描述 许多操作系统采用正则表达式实现文件匹配功能。一种简单的正则表达式由英文字母、数字及通配符“ * ”和“?”组成。“?”代表任意一个字符。“ * ”则可以代表任意多个字符。 现要用正则表达式对部分文件进行操作。 试设计一个算法,找出一个正则表达式,使其能匹配的待操作文件最多,但不能匹配任何不进行操作的文件。所找出的正则表达式的长度还应是最短的。 数...

d3y1`5 81_09 3013

Halcon工业相机开发全流程:从SDK配置到实时图像采集(C++版)

本文详细介绍了使用C++进行Halcon工业相机开发的完整流程,从SDK配置到实时图像采集的实现。涵盖环境搭建、设备初始化、回调机制、参数控制等关键环节,并提供异常处理和实战案例,帮助开发者快速掌握工业视觉系统的开发技巧。

weixin_33728268的博客 512

A-Level经济例题解析及练习Opportunity Cost

例题Question: Opportunity CostYou are selling your 1996 Mustang.&nbsp; You have already spent $1000 on repairs.&nbsp;At the last minute, the transmission dies.&nbsp; You can pay $600 to have it repaired, or sell the car “as is.”In each of the fol

Alevel3的博客 744

揭开正则表达式的神秘面纱

揭开正则表达式的神秘面纱 [出处:http://www.regexlab.com/zh/regref.htm] 引言 正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。比如表达式“ab+” 描述的特征是“一个 'a' 和 任意个 'b' ”,那么 'ab', 'abb', 'abbbbbbb...

转载资源,方便查询 398

mysql 计算不同胜率的活跃玩家的次日,3日,7日留存率

它根据每天的日期(logymd)和最高段位(max_rank)、胜率段落(win_rate_segment)进行分组,并计算总玩家人数(total_players)、第二天的留存人数(next_day_players)、第三天的留存人数(day3_players)和第七天的留存人数(day7_players)。注意:不是新手留存,是段位活跃玩家留存;最终的结果则是将留存数据进行展示,按照日期(date)、最高段位(rank_level)、胜率段落(win_rate_segment)进行排序。

weixin_42698221的博客 1836

(一)正则表达式快速入门、底层实现、语法

如果要想灵活的运用正则表达式,必须了解其中各种元字符的功能,元字符从功能上大致分为:(1)限定符(2)选择匹配符(3)分组组合和反向引用符(1)特殊字符(1)字符匹配符(1)定位符。

yirenyuan的博客 548

Android Framework SurfaceFlinger面试题及参考答案

请简述 SurfaceFlinger 在 Android 系统中的作用。 SurfaceFlinger 是 Android 系统中一个非常关键的服务。它主要负责将多个应用程序的 Surface 合成到一个屏幕显示内容中。 从应用程序的角度来看,每个应用都有自己的 UI 界面,这些 UI 界面实际上是由一系列的图层(Surface)构成。例如,一个应用可能有背景图层、按钮图层、文本图层等。应用通过向 SurfaceFlinger 提供这些 Surface 来请求显示。 SurfaceFl

大模型大数据攻城狮的专栏 1184

黑猫带你学Nand第8篇:NandFlash的供电情况详解

是指在任何工作条件下,设备允许的最大电压、电流、功率以及温度等参数的界限值。

黑猫奥利奥的博客 1148

最简单的java正则表达式

最简单的java正则表达式 浅入浅出java正则表达式,用最容易理解的顺序快速理解java正则表达式 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 一、正则的基础使用 判断一串字符是否全为数字 boolean bool = Pattern.matches("\\d+","1234csdn"); System.out.println(b..

www.小白 638

openHarmony之AI Engine:万字讲解如何在应用、开发板上接入AI大模型调用

本文章介绍如何在 OpenHarmony 开发板上集成和部署各类 AI 大模型,实现终端直接聊天功能,并为语音助手、智能机器人等应用提供 AI 接口支持。

m0_67505153的博客 619

Leetcode刷题笔记题解(C++):10. 正则表达式匹配

思路:目前只采用了递归的方法来求解 这道题最麻烦的地方在出现*的情况。 首先从最简单的情况开始,只看要比较的两个字符,即源字符串s[i]和模式串p[j] 如果p[j] == '.'或者p[j] == s[i]:当前匹配成功 如果p[j] == '*':需要进一步分情况讨论,假设p[j]前面p[j-1]存在 如果p[j-1] == '.'或者p[j-1] == s[i],则p[j-1]p[j]这两个模式串可以使用1到无数次,匹配成功 如果p[j-1] == '.'和p[j-1] == s[i]都不...

Demo.demo的博客 306

YOLOv8 骨骼结构识别详细说明

YOLOv8骨骼结构识别是一种基于深度学习技术的医学影像分析方法,主要用于X光、CT等影像中的骨骼定位与识别。该系统具有多骨骼同步识别能力,可应用于手部、脊柱、骨盆等不同部位,并能精确定位骨骼关键点。技术实现包括数据预处理、模型训练、推理检测、关键点分析和批量处理五个核心模块,支持骨折检测、骨龄评估等临床应用。该系统需注意医学合规性,要求高质量标注数据,并针对骨骼影像特点进行特征工程优化,同时考虑不同设备的部署需求。

u010117029的博客 330

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java正则表达式的实现

Java正则表达式的实现:Pattern和Matcher

阿斌Blog 612

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

最简单的正则表达式

最简单的正则表达式 最简单的正则表达式  hi 能匹配的字符串(举例)hi him his this philips 只想要这个结果:\bhi\b \b[Hh]i\b \b(H|h)i\b 那么只匹配:hi \d+匹配数字串 匹配结果:10000,1234567,222222,8888888等等 "\b"匹配一个单词的边界   ...

kevin860的博客 450

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JS对正则表达式的实现

【代码】JS对正则表达式的实现。

F-T-er 812

最最简单的正则表达式(Java表达)

一、你身边的例子: 创建一个Oracle账户,鼠标刚离开,你怎么就知道邮箱无效? 准备手机登录,刚点击获取验证码,你怎么就知道号码格式错误? 二、答案揭晓:正则表达式                     去学去吧! ...

yongganzhe02的博客 565

java正则表达式的简单使用

  正则表达式的定义: 它是一个用于匹配字符串的模型或者模板. 语法: 最简单的形式就是去寻找一个或一段字符.它使用一些特殊的字符,如[*], 表示任意形式的字符串. [.]表示任意单个字符串. jdk中正则表达式的相关的包和类: java.util.regex.Pattern: 建立匹配模型 java.util.regex.Matcher: 匹配器 使用这两个类的步骤:  1.编译...

qingfengxia2013的专栏 114

前端正则表达式,最简单的

一.和正则相关的方法 使用正则表达式的格式 “/ /” 一般常用的跟正则相关的方法有match、test和replace。 其中match,replace都是字符串上的方法,test是正则对象上的方法。 1.test() ,一般用于表单验证 (1)正则对象方法,检测测试字符串是否符合该规则,返回true和false,参数(测试字符串) (2)Boolean = 表达式.test("要验证的内容"); 2.replace() (1)replace() 方法用于在字符串中用一些字符替换...

叮当的猫猫的博客 1636

正则表达式简易实现

正则表达式        虽然正则表达式在 U n i x/Linux程序设计环境里随处可见,但在其他的系统里使用得却没有这么广泛。一个正则表达式本身也是一个字符序列,它定义了一集能与之匹配的字符串。大部分字符只是简单地与相同字符匹配,例如正则表达式 a b c将匹配同样的字符序列,无论它出现在什么地方。在这里还有几个元字符(meta character),它们分别表示重复、成组或者位置。

__七把刀__ 2523

史上最简单的正则表达式,读完就能让你轻松使用正则表达式

快速上手正则表达式

m0_57396886的博客 1301

最简单的正则表达式例题

import re str1 = ‘中文名:贝拉克·侯赛因·奥巴马,外文名:Barack Hussein Obama II,’ ‘别名:欧巴马,国籍:美国,民族:德裔族,出生地:美国夏威夷州檀香山,’ ‘出生日期:1961年8月4日,职业:政治家、律师、总统,毕业院校:哥伦比亚大学、’ ‘哈佛大学,信仰:新教,主要成就:1996年伊利诺伊州参议员、美国第56届、5’ ‘7届总统、2009年...

QAQ_lunyu的博客 794
上一篇: 位运算——判断整数a是否可被2的幂(2、4、8、16……)整除?
下一篇: “1000瓶药水,其中至多有1瓶剧毒,小狗服完药20小时后才能判断是否中毒。现在给你10只小狗、在24小时内、通过小狗试药的方式找出哪瓶药有毒或者全部无毒”
CodeArhat
博客等级 码龄15年 13粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值