[root@localhost src]# cat a.c

/**

* Linux C 支持正则表达式的字符串替换函数

*

* Author: cnscn@163.com

* Homepage: www.cnscn.org  欢迎您到cns家园来,有好吃的招待哟

* Date:   2007-03-08 17:41

*

*/

#include

#include

#include

#include

#include

//regex

#include

//cns_reg函数的返回类型

typedef struct _reg_rtn_struct

{

int rtn;       //成功与否标志0 成功, 1失败

int pstart;    //匹配到的子串开始位移

int pend;      //匹配到的子串尾部位移

} reg_rtn_struct;

/**

*

* 正则表达式查找函数

*/

reg_rtn_struct cns_reg(const char *str,  const char *pattern)

{

reg_rtn_struct reg_rtn_struct_var;

int          z;            //status

int          pos;          //配置处的位置

int          cflags = REG_EXTENDED;   //compile flags

regex_t      reg;          //compiled regular expression

char         ebuf[128];    //error buffer

bzero(ebuf, sizeof(ebuf));

regmatch_t   pm[10];       //pattern matches 0-9

bzero(pm, sizeof(pm));

const size_t nmatch = 10;  //The size of array pm[]

//编译正则表达式

/**

*

* @param const char*  pattern         将要被编译的正则表达式

* @param regex_t*     reg             用来保存编译结果

* @param int          cflags          决定正则表达式将如何被处理的细节

*

* @return  success    int        0    并把编译结果填充到reg结构中

*          fail       int        非0

*

*/

z = regcomp(&reg, (const char*)pattern, cflags);

if(z)   //此处为 if(z != 0), 因为C语言里0永远为非(False), 任何非0值都为真(True)

{

regerror(z, &reg, ebuf, sizeof(ebuf));

perror("reg1");

fprintf(stderr, "%s: pattern '%s'\n", ebuf, pattern);

reg_rtn_struct_var.rtn    = 1;

reg_rtn_struct_var.pstart = -1;

reg_rtn_struct_var.pend   = -1;

regfree(&reg);

return reg_rtn_struct_var;

}

/**

*

* reg     指向编译后的正则表达式

* str     指向将要进行匹配的字符串

* pm      str字符串中可能有多处和正则表达式相匹配, pm数组用来保存这些位置

* nmacth  指定pm数组最多可以存放的匹配位置数

*

* @return 函数匹配成功后,str+pm[0].rm_so到str+pm[0].rm_eo是第一个匹配的子串

*                           str+pm[1].rm_so到str+pm[1].rm_eo是第二个匹配的子串

*                           ....

*/

z = regexec(&reg, str, nmatch, pm, 0);

//没有找到匹配数据

if(z == REG_NOMATCH)

{

reg_rtn_struct_var.rtn    = 1;

reg_rtn_struct_var.pstart = -1;

reg_rtn_struct_var.pend   = -1;

regfree(&reg);

return reg_rtn_struct_var;

}

else if(z)  //if(z !=0)

{

perror("reg3");

regerror(z, &reg, ebuf, sizeof(ebuf));

fprintf(stderr, "%s: regcomp('%s')\n", ebuf, str);

reg_rtn_struct_var.rtn    = 1;

reg_rtn_struct_var.pstart = -1;

reg_rtn_struct_var.pend   = -1;

regfree(&reg);

return reg_rtn_struct_var;

}

/*列出匹配的位置*/

if(pm[0].rm_so != -1)

{

reg_rtn_struct_var.rtn    = 0;

reg_rtn_struct_var.pstart = pm[0].rm_so;

reg_rtn_struct_var.pend   = pm[0].rm_eo;

}

regfree(&reg);

return reg_rtn_struct_var;

}

/*

* 正则表达式替换函数

*/

char *cns_str_ereplace(char *src, const char *pattern, const char *newsubstr)

{

//如果pattern和newsubstr串相等,则直接返回

if(!strcmp(pattern, newsubstr))   //if(strcmp(pattern, newsubstr)==0)

return src;

//定义cns_reg的返回类型结构变量

reg_rtn_struct  reg_rtn_struct_var;

int rtn    = 0;   //reg_rtn_struct_var.rtn

int pstart = 0;   //reg_rtn_struct_var.pstart

int pend   = 0;   //reg_rtn_struct_var.pend

//把源串预dest

char *dest=src;  //替换后生成的串指针

char *pstr=src;  //当找到串时,pstr就指向子串后面的地址从而标识下一个要查找的源串

//用于malloc的临时内存区

char *tmp;

char *new_tmp_str=dest;

int new_tmp_str_len=0;  //new_tmp_str相对于dest地址开始处的长度

//开始循环替换src串中符合pattern的子串为newstr

while(!rtn)

{

reg_rtn_struct_var=cns_reg(new_tmp_str, pattern);

rtn    = reg_rtn_struct_var.rtn;

pstart = reg_rtn_struct_var.pstart;

pend   = reg_rtn_struct_var.pend;

if(!rtn)

{

//分配新的空间: strlen(newstr):新串长  pend-pstart:旧串长

tmp=(char*)calloc(sizeof(char), strlen(dest)+strlen(newsubstr)-(pend-pstart)+1 );

//把src内的前new_tmp_str_len+pstart个内存空间的数据,拷贝到arr

strncpy(tmp, dest, new_tmp_str_len+pstart);

//标识串结束

tmp[new_tmp_str_len+pstart]='\0';

//连接arr和newstr, 即把newstr附在arr尾部, 从而组成新串(或说字符数组)arr

strcat(tmp, newsubstr);

//把src中 从oldstr子串位置后的部分和arr连接在一起,组成新串arr

strcat(tmp, new_tmp_str+pend);

//把用malloc分配的内存,复制给指针dest

dest = strdup(tmp);

//释放malloc分配的内存空间

free(tmp);

new_tmp_str_len = new_tmp_str_len + pstart + strlen(newsubstr);

new_tmp_str=dest+new_tmp_str_len;

}

}

return dest;

}

int main()

{

//测试正则表达式

char str[]="1love2love3love4love5love6love!";

reg_rtn_struct reg_rtn_struct_var;

char *newstr=cns_str_ereplace(str,".?.?ve","..");

puts(newstr);

return 0;

}[root@localhost src]#gcc -g a.c -o a && ./a

_such_.._you_love_you_love_you_sir!

_such_.._you_.._you_love_you_sir!

_such_.._you_.._you_.._you_sir!

_such_.._you_.._you_.._you_sir!

c语言正则表达式替换,Linux C 支持正则表达式的字符串替换函数...相关推荐

  1. linux c中字符替换函数,Linux C 支持正则表达式的字符串替换函数

    [root@localhost src]# cat a.c /** * Linux C 支持正则表达式的字符串替换函数 * * Author: cnscn@163.com * Homepage: ww ...

  2. linux邮箱格式正则表达式grep,Linux系统grep正则表达式的介绍

    Linux系统正则表达式是字符串的标示方法, 主要的正则表达式有sed.vim.awk,当然还包括grep正则表达式.前文我们已经介绍了Linux系统正则表达式的用法,今天就来着重介绍一下Linux系 ...

  3. linux 文件 查找内容替换,linux递归查找文件内容并替换

    sed -i 's/原字符串/替换后字符串/g' `grep '搜索关键字' -rl /data/目标目录/ --include "*.html"` 上面是递归查找目录中所有的HT ...

  4. mysql 替换空值_MySQL查询用空字符串替换NULL

    MySQL查询用空字符串替换NULL 如何用空字符串替换select中的NULL值?输出" NULL"值看起来不是很专业. 这是非常不寻常的,根据我的语法,我希望它能正常工作.希望 ...

  5. linux如何用vi查找字符串替换,在Vi里面实现字符串的批量替换

    在Vi里面实现字符串的批量替换. a. 文件内全部替换: %s#abc#def#g(用def替换文件中所有的abc) 例如把一个文本文件里面的"linuxidc.com"全部替换成 ...

  6. python字符串替换正则_【python】 字符串替换+正则

    因为看电影字幕有些不必要的想删除,此段代码用于删除{}内的内容. python 中 string的replace函数并不能直接使用 正则表达式,所以我们采取compile的方式: 其中re为正则的标准 ...

  7. Mysql:替换某个字段中的部分字符串——replace函数

    需求:因同事操作不当,使某个字段出现了不必要的字符串,导致数据无法正常解析,需要将该字符串统一去掉. 查看全文 http://www.taodudu.cc/news/show-1017337.html ...

  8. MySql: 替换某个字段中的指定字符串——replace函数

    最近因图片地址更改,需要替换掉前缀部分. replace函数 语法:replace(object,search,replace) 语义:把object对象中出现的的search全部替换成replace ...

  9. linux正则表达式的使用方法,Linux中基本正则表达式

    正则表达式 的 Linux中基本正则表达式 字符匹配: .  :匹配任意单个字符 [] :匹配指定范围内的任意单个字符: [^]:匹配制定范围外任意单个字符 [:digit:] lower upper ...

  10. python字符串正则替换_Python用正则表达式进行字符串替换方法

    Python正则表达式在使用中会经常应用到字符串替换的代码.这篇文章主要介绍了Python正则表达式如何进行字符串替换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下. Python正则表达式在使用 ...

最新文章

  1. threadlocal使用场景_深入剖析ThreadLocal
  2. 清华天才王垠受邀面试阿里P9,被阿里P10赵海平面跪,整个事件回顾...
  3. 拥抱 Node.js 8.0,N-API 入门极简例子
  4. hdu 4417 划分树
  5. 手工卸载oracle,升级和卸载Oracle数据库软件的命令整理
  6. caffe:无法读取文件cuda8.0.props
  7. raid 物理盘缓存状态_服务器raid卡、磁盘缓存的配置策略
  8. spyder pyecharts不显示_我的显示器需要定时校色吗?
  9. 中秋国庆假期富士康疯狂加班生产iPhone 12:新员工入职奖励9000元!
  10. asp Eval()函数的一些使用总结
  11. MAC 上的 Live Writer : ecto
  12. 用UltraISO刻录CDDVD系统光盘的图文教程
  13. C# ObservableCollection集合排序
  14. 微软产品居然出现中文兼容问题
  15. word里面怎样输入空白下划线
  16. rust怎么上邮轮_实拍沉入海底的泰坦尼克号:被海水腐蚀严重,船体将于10年后消失...
  17. 下列哪个不是python的第三方库_以下选项中,不是 Python 中用于开发用户界面的第三方库是()...
  18. Win10玩方舟生存进化崩溃怎么办?
  19. 新建vue-cli项目body与页面边框存在间隙
  20. 微软sus服务器搭建,规划和部署 Exchange Server

热门文章

  1. SQL判断字段是否为空,为NULL
  2. JavaScript 复习之 XMLHttpRequest 对象
  3. Web 端的测试 Selenium 用法必备
  4. Django中ORM常用字段及字段参数
  5. 2018java面试集合
  6. HBase MemStore和Compaction剖析
  7. Hadoop数据传输工具sqoop - 样例
  8. 誉赐 PC阳光板www.ycpc.icoc.cn/详尽概述
  9. 2010_8_16_Router_路由器的密码恢复
  10. git把项目上传到github的常用命令