使用正则表达式(regex_replace)模拟读取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);
}
*/ 

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

(0)

相关推荐

  • jQuery获取上传文件的名称的正则表达式

    方法一: $('input[type="file"]').on('change', function() { var reg = /[^\\\/]*[\\\/]+/g; //匹配文件的名称和后缀的正则表达式 var name = $(this).val().replace(reg, ''); var postfix = /\.[^\.]+/.exec(name);//获取文件的后缀 var text =name.substr(0,postfix['index']);//获取没有后缀的名

  • MySQL中使用replace、regexp进行正则表达式替换的用法分析

    本文实例讲述了MySQL中使用replace.regexp进行正则表达式替换的用法.分享给大家供大家参考,具体如下: 今天一个朋友问我,如果将数据库中查到的类似于"./uploads/110100_cityHotel_北京富豪华宾馆.jpg"这样的格式都修改为"./uploads/110100cityHotel北京富豪华宾馆.jpg"这样的格式.我本人是没有这样处理过数据的,但是我知道mysql是可以使用replace做到的,而且正则表达式也可以做到. 如何做呢?

  • FileUpload1 上传文件类型验证正则表达式

    复制代码 代码如下: <asp:RegularExpressionValidator   id="FileUpLoadValidator" runat="server"   ErrorMessage="Upload Jpegs and Gifs only."   ValidationExpression="^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.jpg|.JPG|.gif|.GIF)

  • 使用Linux正则表达式灵活搜索文件中的文本

    正则表达式是一种符号表示法,用于识别文本模式.Linux处理正则表达式的主要程序是grep.grep搜索与正则表达式匹配的行,并将结果输送至标准输出. 1. grep匹配模式 grep按下述方式接受选项和参数(其中,regex表示正则表达式) 复制代码 代码如下: grep [options] regex [files] 其中options主要为下表: 选项 含义 功能描述 -i ignore case 忽略大小写 -v invert match 不匹配匹配的 -l file-with-matc

  • 使用正则表达式(regex_replace)模拟读取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); // 测试ssc

  • 使用shell读取ini文件方法步骤

    目录 动机 .ini 类文件格式 在 shell 脚本中处理 .ini 文件时要执行的操作 假定处理系统 查看部分列表 仅提取特定部分 如何限定 shell 变量名 Shell scripting 动机 我决定编写一个脚本来进行干净的 macOS (BSD) / Linux 的初始设置. 我认为有一个 tsukkomi 说“现在大多数发行版都预装了 perl / python”,但我决定使用 Shell 脚本(bash),因为它易于编写进程过程. 但是,用shell语法写各种配置文件是不可读的,

  • Python读取ini文件、操作mysql、发送邮件实例

    我是闲的没事干,2014过的太浮夸了,博客也没写几篇,哎~~~ 用这篇来记录即将逝去的2014 python对各种数据库的各种操作满大街都是,不过,我还是喜欢我这种风格的,涉及到其它操作,不过重点还是对数据库的操作.呵~~ Python操作Mysql 首先,我习惯将配置信息写到配置文件,这样修改时可以不用源代码,然后再写通用的函数供调用 新建一个配置文件,就命名为conf.ini,可以写各种配置信息,不过都指明节点(文件格式要求还是较严格的): 复制代码 代码如下: [app_info] DAT

  • C 读取ini文件的实例详解

    C 读取ini文件 前言: 在Windows下可以用GetPrivateProfileString或GetPrivateProfileInt方便读取.ini配置文件内容,但是在Linux平台上就一筹莫展了.为了解决该问题,打算用C来读取.ini,即可不受平台的限制了. #define CONF_FILE_PATH "Config.ini" #include <string.h> #ifdef WIN32 #include <Windows.h> #include

  • Delphi建立、读取、存贮INI文件的方法《一》

    一.有必要了解INI文件的结构: ;注释 [小节名] 关键字=值 ... INI文件允许有多个小节,每个小节又允许有多个关键字, "="后面是该关键字的值. 值的类型有三种:字符串.整型数值和布尔值.其中字符串存贮在INI文件中时没有引号,布尔真值用1表示,布尔假值用0表示. 注释以分号";"开头. 二.定义 1.在Interface的Uses节增加IniFiles: 2.在Var变量定义部分增加一行: myinifile:Tinifile; 然后,就可以对变量my

  • asp.net INI文件读写类

    复制代码 代码如下: using System; using System.Runtime.InteropServices; using System.Text; using System.IO; namespace Common { /// <summary> /// INI文件读写类. /// </summary>     public class INIFile     {         public string path; public INIFile(string I

  • C# Ini文件操作实例

    在开源中国看到的操作ini文件的,写的还不看,留着以后用 复制代码 代码如下: using System;using System.IO;using System.Runtime.InteropServices;using System.Text;using System.Collections;using System.Collections.Specialized; namespace wuyisky{ /**//**/ /**//// <summary> /// IniFiles的类 /

  • PHP读取配置文件类实例(可读取ini,yaml,xml等)

    本文实例讲述了PHP读取配置文件类实例.分享给大家供大家参考.具体如下: <?php class Settings { var $_settings = array (); function get($var) { $var = explode ( '.', $var ); $result = $this->_settings; foreach ( $var as $key ) { if (! isset ( $result [$key] )) { return false; } $resul

  • C#实现读写ini文件类实例

    本文实例讲述了C#实现读写ini文件类.分享给大家供大家参考.具体如下: 这个C#类封装了对INI配置文件进行操作所需的各种函数,包括读取键值.读取键值.删除段落等 using System; using System.Runtime.InteropServices; using System.Text; namespace DotNet.Utilities { /// <summary> /// INI文件读写类. /// </summary> public class INIF

  • C#读写INI文件的方法

    本文实例讲述了C#读写INI文件的方法.分享给大家供大家参考.具体如下: 虽然微软早已经建议在WINDOWS中用注册表代替INI文件,但是在实际应用中,INI文件仍然有用武之地,尤其现在绿色软件的流行,越来越多的程序将自己的一些配置信息保存到了INI文件中. INI文件是文本文件,由若干节(section)组成,在每个带括号的标题下面,是若干个关键词(key)及其对应的值(Value) [Section] Key=Value VC中提供了API函数进行INI文件的读写操作,但是微软推出的C#编程

随机推荐