正则模拟读取INI文件的步奏详解
这次给大家带来正则模拟读取INI文件的步奏详解,使用正则模拟读取INI文件的注意事项有哪些,下面就是实战案例,一起来看一下。
废话不多说了,直接给大家贴代码了,具体代码如下所示:
#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); } */
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
以上是正则模拟读取INI文件的步奏详解的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

在电脑中删除或解压缩文件夹,时有时候会弹出提示对话框“错误0x80004005:未指定错误”,如果遇到这中情况应该怎么解决呢?提示错误代码0x80004005的原因其实有很多,但大部分因为病毒导致,我们可以重新注册dll来解决问题,下面,小编给大伙讲解0x80004005错误代码处理经验。有用户在使用电脑时出现错误代码0X80004005的提示,0x80004005错误主要是由于计算机没有正确注册某些动态链接库文件,或者计算机与Internet之间存在不允许的HTTPS连接防火墙所引起。那么如何

夸克网盘和百度网盘都是现在最常用的储存文件的网盘软件,如果想要将夸克网盘内的文件保存到百度网盘,要怎么操作呢?本期小编整理了夸克网盘电脑端的文件转移到百度网盘的教程步骤,一起来看看是怎么操作吧。 夸克网盘的文件怎么保存到百度网盘?要将夸克网盘的文件转移到百度网盘,首先需在夸克网盘下载所需文件,然后在百度网盘客户端中选择目标文件夹并打开。接着,将夸克网盘中下载的文件拖放到百度网盘客户端打开的文件夹中,或者使用上传功能将文件添加至百度网盘。确保上传完成后在百度网盘中查看文件是否成功转移。这样就

文件路径是操作系统中用于识别和定位文件或文件夹的字符串。在文件路径中,常见的有两种符号分隔路径,即正斜杠(/)和反斜杠()。这两个符号在不同的操作系统中有不同的使用方式和含义。正斜杠(/)是Unix和Linux系统中常用的路径分隔符。在这些系统中,文件路径是以根目录(/)为起始点,每个目录之间使用正斜杠进行分隔。例如,路径/home/user/Docume

最近有很多网友问小编,hiberfil.sys是什么文件?hiberfil.sys占用了大量的C盘空间可以删除吗?小编可以告诉大家hiberfil.sys文件是可以删除的。下面就来看看详细的内容。hiberfil.sys是Windows系统中的一个隐藏文件,也是系统休眠文件。通常存储在C盘根目录下,其大小与系统安装内存大小相当。这个文件在计算机休眠时被使用,其中包含了当前系统的内存数据,以便在恢复时快速恢复到之前的状态。由于其大小与内存容量相等,因此它可能会占用较大的硬盘空间。 hiber

Windows操作系统是全球最流行的操作系统之一,其新版本Win11备受瞩目。在Win11系统中,管理员权限的获取是一个重要的操作,管理员权限可以让用户对系统进行更多的操作和设置。本文将详细介绍在Win11系统中如何获取管理员权限,以及如何有效地管理权限。在Win11系统中,管理员权限分为本地管理员和域管理员两种。本地管理员是指具有对本地计算机的完全管理权限

OracleSQL中的除法运算详解在OracleSQL中,除法运算是一种常见且重要的数学运算操作,用于计算两个数相除的结果。除法在数据库查询中经常用到,因此了解OracleSQL中的除法运算及其用法是数据库开发人员必备的技能之一。本文将详细讨论OracleSQL中除法运算的相关知识,并提供具体的代码示例供读者参考。一、OracleSQL中的除法运算

MySQL中.ibd文件的作用详解及相关注意事项MySQL是一种流行的关系型数据库管理系统,数据库中的数据存储在不同的文件中。其中,.ibd文件是InnoDB存储引擎中的数据文件,用于存储表中的数据和索引。本文将对MySQL中.ibd文件的作用进行详细解析,并提供相关代码示例以帮助读者更好地理解。一、.ibd文件的作用:存储数据:.ibd文件是InnoDB存

PHP中的模运算符(%)是用来获取两个数值相除的余数的。在本文中,我们将详细讨论模运算符的作用及用法,并提供具体的代码示例来帮助读者更好地理解。1.模运算符的作用在数学中,当我们将一个整数除以另一个整数时,会得到一个商和一个余数。例如,当我们将10除以3时,商为3,余数为1。模运算符就是用来获取这个余数的。2.模运算符的用法在PHP中,使用%符号来表示模
