侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

使用正则表达式(regex_replace)模拟读取INI文件

前端  /  管理员 发布于 7年前   301

废话不多说了,直接给大家贴代码了,具体代码如下所示:

#include "stdio.h" #include <sstream> #include <iostream> #include <fstream> #include <regex> using namespace std; void Trim(char * str); void lTrim(char * str); void rTrim(char * str); // 测试sscanf 和 正则表达式 // sscanf提供的这个扩展功能其实并不能真正称为正则表达式,因为他的书写还是离不开% // []表示字符范围,{}表示重复次数,^表示取非,*表示跳过。所以上面这个url的解析可以写成下面这个样子: // //char url[] = "dv://192.168.1.253:65001/1/1" // //sscanf(url, "%[^://]%*c%*c%*c%[^:]%*c%d%*c%d%*c%d", protocol, ip, port, chn, type); // //解释一下 //先取得一个最长的字符串,但不包括字串 ://,于是protocol="dv\0"; //然后跳过三个字符,(%*c)其实就是跳过 :// // 接着取一个字符串不包括字符串 : ,于是ip = 192.168.1.253,这里简化处理了,IP就当个字符串来弄,而且不做检查 // 然后跳过冒号取端口到port,再跳过 / 取通道号到chn,再跳过 / 取码流类型到type。 // c语言实现上例 void test1() {  char url[] = "dv://192.168.1.253:65001/1/1";  char protocol[10];  char ip[17];  int port;  int chn;  int type;  sscanf(url, "%[^://]%*c%*c%*c%[^:]%*c%d%*c%d%*c%d", protocol, ip, &port, &chn, &type);  printf("%s, %s, %d, %d, %d\n", protocol, ip, port, chn, type); } // 读取ini里某行字符串, 得到: hello world! // 正常串1: -claim="hello world!" // 正常串2: claim = "hello world!" // 正常串3: claim = " hello world!" // 正常串4: claim_ = hello world! // 干扰串1: cl-aim = \"hello world!" // 干扰串2: clai3m = "hello world!\" // 干扰串3: cla_im = \\"hello world!\" // 干扰串4: claim ='"hello world!\" // 干扰串5: claim= @"\nhello world!" // 干扰串6: claim=L"hello world!" // 未处理1: claim[1] = 1 // 未处理1: claim[2] = 1 void test2() {  char line[1000] = { 0 };  char val[1000] = { 0 };  char key[1000] = { 0 };  FILE *fp = fopen("1.txt", "r");  if (NULL == fp)  {   printf("failed to open 1.txt\n");   return ;  }  while (!feof(fp))  {   memset(line, 0, sizeof(line));   fgets(line, sizeof(line) - 1, fp); // 包含了每行的\n   printf("%s", line);   Trim(line);   // 提取等号之前的内容   memset(key, 0, sizeof(key));   // sscanf使用的format不是正则表达式,不能用 \\s 表示各种空白符,即空格或\t,\n,\r,\f   sscanf(line, "%[^ \t\n\r\f=]", key);   //sscanf(line, "%*[^a-zA-Z0-9_-]%[^ \t\n\r\f=]", key);   printf(" key: [%s]\n", key);   // 提取等号之后的内容   memset(val, 0, sizeof(val));   sscanf(line, "%*[^=]%*c%[^\n]", val); // 不包含了每行的换行符   Trim(val);   printf(" val: [%s]\n", val);   // 去除两边双引号   // ...   // 插入map   // map[key]=value;   // string 转 其它类型   // atoi, atol, atof  }  printf("\n");  fclose(fp); } // 上例的C++实现 template<class T1, class T2> inline T1 parseTo(const T2 t) {  static stringstream sstream;  T1 r;  sstream << t;  sstream >> r;  sstream.clear();  return r; } void test3() {  char val[1000] = { 0 };  char key[1000] = { 0 };  ifstream fin("1.txt");  string line;  if (fin)  {   while (getline(fin, line)) // line中不包括每行的换行符   {    cout << line << endl;    /// 提取等号之前的内容    // 第1组()表示任意个空格字符,第2组()表示单词(可带_或-),    // 第3组()表示1个以上的空格字符(或=),最后以任意字符串结尾    regex reg("^([\\s]*)([\\w\\-\\_]+)([\\s=]+).*$");    // 取第2组代替原串    string key = regex_replace(line, reg, "$2");    cout << " key: {" << key << "}" << endl;    /// 提取等号之后的内容    // 第1组()表示任意个空格字符,第2组()表示单词(可带_或-),    // 第3组()表示1个以上的空格字符(或=),第4组()表示任意个字符,    // 第5组()表示以任意个空格字符(或回车换行符)结尾。    reg = regex("^([\\s]*)([\\w\\-\\_]+)([\\s=]+)(.*)([\\s\\r\\n]*)$");    // 取第4组代替原串    string val = regex_replace(line, reg, "$4");    cout << " val: {" << val << "}" << endl;    // 去除两边双引号    // ...    // 插入map    // map[key]=value;    // string 转 其它类型    // int i = parseTo<int>("123");    // float f = parseTo<float>("1.23");    // string str = parseTo<string>(123);   }  }  else // 没有该文件  {   cout << "no such file" << endl;  } } void main() {  //test1();  test2();  test3(); } void lTrim(char * str) {  int i, len;  len = strlen(str);  for (i = 0; i<len; i++)  {   if (str[i] != ' ' && str[i] != '\t' && str[i] != '\n' && str[i] != '\r' && str[i] != '\f') break;  }  memmove(str, str + i, len - i + 1);  return; } void rTrim(char * str) {  int i, len;  len = strlen(str);  for (i = len - 1; i >= 0; i--)  {   if ((str[i] != ' ') && (str[i] != 0x0a) && (str[i] != 0x0d) && (str[i] != '\t') && (str[i] != '\f')) break;  }  str[i + 1] = 0;  return; } void Trim(char * str) {  int i, len;  //先去除左边的空格  len = strlen(str);  for (i = 0; i<len; i++)  {   if (str[i] != ' ' && str[i] != '\t' && str[i] != '\n' && str[i] != '\r' && str[i] != '\f') break;  }  memmove(str, str + i, len - i + 1);  //再去除右边的空格  len = strlen(str);  for (i = len - 1; i >= 0; i--)  {   if (str[i] != ' ' && str[i] != '\t' && str[i] != '\n' && str[i] != '\r' && str[i] != '\f') break;  }  str[i + 1] = 0;  return; } /* void Trim(char * str) {  lTrim(str);  rTrim(str); } */ 


以上所述是小编给大家介绍的使用正则表达式(regex_replace)模拟读取INI文件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对站的支持!


  • 上一条:
    正则表达式判定保留2位小数的实现代码
    下一条:
    正则表达式注册表验证笔记整理
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 使用 Alpine.js 排序插件对元素进行排序(0个评论)
    • 在js中使用jszip + file-saver实现批量下载OSS文件功能示例(0个评论)
    • 在vue中实现父页面按钮显示子组件中的el-dialog效果(0个评论)
    • 使用mock-server实现模拟接口对接流程步骤(0个评论)
    • vue项目打包程序实现把项目打包成一个exe可执行程序(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-03
    • 2018-04
    • 2018-05
    • 2018-06
    • 2018-09
    • 2018-11
    • 2018-12
    • 2019-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客