C语言正则表达式 regnext regreplace regreplaceAll

由于C语言的正则表达式API相对比较简易.默认API只有regcomp/regerror/regexec/regfree这些函数.相对于其他的高级语言中正则表达式所所能实现的功能(如:查找/替换)有所欠缺.所以想着自己写下一些需要的函数以备后续需要使用.

#ifndef _E_REGEX_INCLUDE
#define _E_REGEX_INCLUDE
#include <regex.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>typedef int errno_t;static size_t position = 0;//functions prototype
char* regnext(regex_t* regex,char* content);
void _r_release(void);
bool regreplace(regex_t* regex,char** content,char* replacement);
void regreplaceAll(regex_t* regex,char** content,char* replacement);int main(void){char* content = (char*)"sjdlf12323ldjslfjsjf133334";char* pattern = (char*)"([[:digit:]][[:digit:]])\\1";regex_t regex;errno_t state = regcomp(&regex,pattern,REG_EXTENDED);if(state){char* errbuf = calloc(20,sizeof(char));regerror(state,&regex,errbuf,20);fprintf(stderr,"Regex:%s compile failed.\n""Reason: %s\n",pattern,errbuf);free(errbuf);regfree(&regex);exit(EXIT_FAILURE);}printf("content: %s\n",content);char* replacement = (char*)"";regreplaceAll(&regex,&content,replacement);printf("content: %s\n",content);regfree(&regex);
}//find next match
char* regnext(regex_t* regex,char* content){regmatch_t matches[regex->re_nsub + 1];errno_t state = regexec(regex,content,regex->re_nsub + 1,matches,0);if(state == REG_NOMATCH){_r_release();return NULL;}char* reval = (char*)calloc(matches[0].rm_eo - matches[0].rm_so + 1,sizeof(char));memcpy(reval,content + position + matches[0].rm_so,matches[0].rm_eo - matches[0].rm_so);position += matches[0].rm_eo;return reval;
}//replace first
bool regreplace(regex_t* regex,char** content,char* replacement){regmatch_t matches[regex->re_nsub + 1];errno_t state = regexec(regex,*content,regex->re_nsub + 1,matches,0);if(state == REG_NOMATCH){return false;}char* newContent = (char*)calloc(strlen(*content) + strlen(replacement) - (matches[0].rm_eo - matches[0].rm_so),sizeof(char));size_t head = matches[0].rm_so;size_t middle = strlen(replacement);size_t end = strlen(*content) - matches[0].rm_eo;memcpy(newContent,*content,head);memcpy(newContent + head,replacement,middle);memcpy(newContent + head + middle,*content + matches[0].rm_eo,end);*content = newContent;return true;
}//replace all
void regreplaceAll(regex_t* regex,char** content,char* replacement){for(;regreplace(regex,content,replacement););
}void _r_release(void){position = 0;
}#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/799074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring AI 来了,打造Java生态大模型应用开发新框架!

Spring AI 来了&#xff0c;打造Java生态大模型应用开发新框架&#xff01; Spring AI 开发框架设计理念Spring AI 主要功能特性如下 Spring AI 应用开发案例案例一&#xff1a;基于大模型的对话应用开发案例二&#xff1a;RAG 检索增强应用开发案例三&#xff1a;Function Cal…

15-1-Flex布局

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 Flex布局1 Flex容器和Flex项目2 Flex 容器属性2.1 主轴的方向2.2 主轴对齐方式…

Linux ftpshut命令教程:如何优雅地关闭FTP服务器(附实例详解和注意事项)

Linux ftpshut命令介绍 ftpshut命令是Linux系统中用于在指定的时间关闭FTP服务器的命令。这个命令提供了一个自动化的关闭程序&#xff0c;超级用户可以使用它来自动断开当前的proftpd连接&#xff0c;并拒绝新的连接。当服务器关闭后&#xff0c;会在/etc目录下生成一个名为s…

vscode-插件开发-hello world-创建初始模板

参考vscode官方示例&#xff1a;如何创建你的第一个插件开发项目模板的步骤进行了下文操作。 目录 前言1.环境配置全局安装 yo, generator-code 2. 新建一个插件项目模板问题1: F5 按键无法启动launch.json调试(解决)问题1 描述:问题1: 找错误问题1: 可行的解决方案 3. 开发插…

SpringBoot集成Redis快速入门Demo

目录 1. Redis概述 2.下载安装 3. Spring-data-redis概述 4. 快速入门 4.1 创建工程 4.2 导入依赖 4.3 添加配置文件 4.4 添加Redis配置 4.5 添加Redis工具类 4.6 添加测试类 5. Demo下载地址 1. Redis概述 Redis&#xff08;Remote Dictionary Server 远程…

ics-05-攻防世界

题目 点了半天只有设备维护中心能进去 御剑扫一下 找到一个css 没什么用 再点击云平台设备维护中心url发生了变化 设备维护中心http://61.147.171.105:65103/index.php?pageindex试一下php伪协议 php://filter/readconvert.base64-encode/resourceindex.php base64解一下…

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第九套

华为海思校园招聘-芯片-数字 IC 方向 题目分享&#xff08;有参考答案&#xff09;——第九套 部分题目分享&#xff0c;完整版获取&#xff08;WX:didadidadidida313&#xff0c;加我备注&#xff1a;CSDN huawei数字芯片题目&#xff0c;谢绝白嫖哈&#xff09; 单选 1&…

(Git) gitignore基础使用

文章目录 前言.gitignore 模式匹配注释 #转义 \直接匹配任意字符匹配 *单个字符匹配 ?目录分割 /多级目录 **范围匹配 []取消匹配 ! 检查是否生效父子文件END 前言 Git - gitignore Documentation (git-scm.com) 在使用git管理的项目中&#xff0c;可以通过.gitignore文件管理…

go对象的创建和使用 orm map对象和List 时间 json get/post请求

1.对象的创建和使用 type Role struct {Id string json:"Id"RoleName string json:"RoleName"State uint json:"State" } var u new(Role) var role Role var data []Role structObj : Role{}2.对象和orm的使用 func TestSelectOn…

【Redis 知识储备】冷热分离架构 -- 分布系统的演进(5)

冷热分离架构 简介出现原因架构工作原理技术案例架构优缺点 简介 引入缓存, 实行冷热分离, 将热点数据放到缓存中快速响应 (如存储到 Redis中) 出现原因 海量的请求导致数据库负载过高, 站点响应再读变慢 架构工作原理 多了缓存服务器, 对于热点数据全部到缓存中, 不常用数…

【Redis 知识储备】垂直分库架构 -- 分布系统的演进(6)

垂直分库架构 简介出现原因架构工作原理技术案例架构优缺点 简介 数据库的数据被拆分, 数据库分布式存储, 分布式处理, 分布式查询, 也可以理解为分布式数据库框架 出现原因 单机的写库会逐渐会达到性能瓶颈, 需要拆分数据库, 数据表的数据量太大, 处理压力太大, 需要进行分…

阿里云服务器可以干什么?阿里云服务器主要用途是干嘛的?

阿里云服务器可以干嘛&#xff1f;能干啥你还不知道么&#xff01;简单来讲可用来搭建网站、个人博客、企业官网、论坛、电子商务、AI、LLM大语言模型、测试环境等&#xff0c;阿里云百科aliyunbaike.com整理阿里云服务器的用途&#xff1a; 阿里云服务器活动 aliyunbaike.com…

armlinux裸机-uart

uart是一对一的串行异步全双工通信通信协议&#xff0c;串行速度较慢&#xff08;usart支持同步通信&#xff09; 传输原理 多个参数可以设置 为满足使用需求&#xff0c;我们一般都用带fifo缓冲中断。 我们使用S3C2440芯片&#xff0c;具体寄存器操作可以查看用户手册

ES入门十四:分词器

我们存储到ES中数据大致分为以下两种&#xff1a; 全文本&#xff0c;例如文章内容、通知内容精确值&#xff0c;如实体Id 在对这两类值进行查询的时候&#xff0c;精确值类型会比较它们的二进制&#xff0c;其结果只有相等或者不想等。而对全文本类型进行等值比较是不太实现…

【深度学习】StableDiffusion的组件解析,运行一些基础组件效果

文章目录 前言vaeclipUNetunet训练帮助、问询 前言 看了篇文&#xff1a; https://zhuanlan.zhihu.com/p/617134893 运行一些组件试试效果。 vae 代码&#xff1a; import torch from diffusers import AutoencoderKL import numpy as np from PIL import Image# 加载模型…

Redis分布式锁误删情况说明

4.4 Redis分布式锁误删情况说明 逻辑说明&#xff1a; 持有锁的线程在锁的内部出现了阻塞&#xff0c;导致他的锁自动释放&#xff0c;这时其他线程&#xff0c;线程2来尝试获得锁&#xff0c;就拿到了这把锁&#xff0c;然后线程2在持有锁执行过程中&#xff0c;线程1反应过…

Linux 命令完全手册(1),受益匪浅

第一列返回的是行数&#xff0c;第二列是字数&#xff0c;第三列则是比特数。 我们可以让它只计算行数&#xff1a; wc -l test.txt 或者只计算字数&#xff1a; wc -w test.txt 或者只计算比特数&#xff1a; wc -c test.txt 在 ASCII 字符集中&#xff0c;比特数等于字…

LeetCode-153. 寻找旋转排序数组中的最小值【数组 二分查找】

LeetCode-153. 寻找旋转排序数组中的最小值【数组 二分查找】 题目描述&#xff1a;解题思路一&#xff1a;二分查找&#xff0c;注意在闭区间[0, n-2]解题思路二&#xff1a;0解题思路三&#xff1a;0 题目描述&#xff1a; 已知一个长度为 n 的数组&#xff0c;预先按照升序…

FPGA与数字图像处理专栏分类与索引

基础视频协议 VGA协议 视频流环境搭建以及杂项 1.图像验证算法平台搭建   2.VDMA视频流显示通路搭建   4.PS配置VDMA改PL配置VDMA   7.3*3卷积核生成   12.自定义的多帧缓存架构 色域转换 6.RGB转YCbcr 图像降噪 8.均值滤波   9.图像中值腐蚀膨胀滤波的实现   1…

python爬虫学习第十六天--------URLError和HTTPError、cookie登录、Handler处理器

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…