使用正则表达式模拟读写INI文件

前端之家收集整理的这篇文章主要介绍了使用正则表达式模拟读写INI文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. #include "stdio.h"
  2. #include <sstream>
  3. #include <iostream>
  4. #include <fstream>
  5. #include <regex>
  6. using namespace std;
  7.  
  8. void Trim(char * str);
  9. void lTrim(char * str);
  10. void rTrim(char * str);
  11.  
  12. // 测试sscanf 和 正则表达式
  13. // sscanf提供的这个扩展功能其实并不能真正称为正则表达式,因为他的书写还是离不开%
  14. // []表示字符范围,{}表示重复次数,^表示取非,*表示跳过。所以上面这个url的解析可以写成下面这个样子:
  15. //
  16. //char url[] = "dv://192.168.1.253:65001/1/1"
  17. //
  18. //sscanf(url,"%[^://]%*c%*c%*c%[^:]%*c%d%*c%d%*c%d",protocol,ip,port,chn,type);
  19. //
  20. //解释一下
  21. //先取得一个最长的字符串,但不包括字串 ://,于是protocol="dv\0";
  22. //然后跳过三个字符,(%*c)其实就是跳过 ://
  23. // 接着取一个字符串不包括字符串 : ,于是ip = 192.168.1.253,这里简化处理了,IP就当个字符串来弄,而且不做检查
  24. // 然后跳过冒号取端口到port,再跳过 / 取通道号到chn,再跳过 / 取码流类型到type。
  25.  
  26. // c语言实现上例
  27. void test1()
  28. {
  29. char url[] = "dv://192.168.1.253:65001/1/1";
  30. char protocol[10];
  31. char ip[17];
  32. int port;
  33. int chn;
  34. int type;
  35. sscanf(url,"%[^://]%*c%*c%*c%[^:]%*c%d%*c%d%*c%d",&port,&chn,&type);
  36. printf("%s,%s,%d,%d\n",type);
  37. }
  38.  
  39. // 读取ini里某行字符串,得到: hello world!
  40. // 正常串1: -claim="hello world!"
  41. // 正常串2: claim = "hello world!"
  42. // 正常串3: claim = " hello world!"
  43. // 正常串4: claim_ = hello world!
  44. // 正常串5: claim = "hello world!"
  45. // 正常串6: claim = "hello world!"
  46. // 正常串7: claim =
  47. // 干扰串1: cl-aim = \"hello world!"
  48. // 干扰串2: clai3m = "hello world!\"
  49. // 干扰串3: cla_im = \\"hello world!\"
  50. // 干扰串4: claim ='"hello world!\"
  51. // 干扰串5: claim= @"\nhello world!"
  52. // 干扰串6: claim=L"hello world!"
  53. // 未处理1: claim[1] = 1
  54. // 未处理1: claim[2] = 1
  55.  
  56. void test2()
  57. {
  58. char line[1000] = { 0 };
  59. char val[1000] = { 0 };
  60. char key[1000] = { 0 };
  61.  
  62. FILE *fp = fopen("1.txt","r");
  63. if (NULL == fp)
  64. {
  65. printf("Failed to open 1.txt\n");
  66. return ;
  67. }
  68.  
  69. while (!feof(fp))
  70. {
  71. memset(line,0,sizeof(line));
  72. fgets(line,sizeof(line) - 1,fp); // 包含了每行的\n
  73. printf("%s",line);
  74.  
  75. Trim(line);
  76.  
  77. // 提取等号之前的内容
  78. memset(key,sizeof(key));
  79. // sscanf使用的format不是正则表达式,不能用 \\s 表示各种空白符,即空格或\t,\n,\r,\f
  80. sscanf(line,"%[^ \t\n\r\f=]",key);
  81. //sscanf(line,"%*[^a-zA-Z0-9_-]%[^ \t\n\r\f=]",key);
  82. printf(" key: [%s]\n",key);
  83.  
  84. // 提取等号之后的内容
  85. memset(val,sizeof(val));
  86. sscanf(line,"%*[^=]%*c%[^\n]",val); // 不包含了每行的换行符
  87. Trim(val);
  88. printf(" val: [%s]\n",val);
  89.  
  90. // 去除两边双引号
  91. // ...
  92. // 插入map
  93. // map[key]=value;
  94. // string 转 其它类型
  95. // atoi,atol,atof
  96. }
  97.  
  98. printf("\n");
  99. fclose(fp);
  100. }
  101.  
  102. // 上例的C++实现
  103. template<class T1,class T2>
  104. inline T1 parseTo(const T2 t)
  105. {
  106. static stringstream sstream;
  107. T1 r;
  108. sstream << t;
  109. sstream >> r;
  110. sstream.clear();
  111. return r;
  112. }
  113.  
  114. string trim(string& s)
  115. {
  116. if (s.empty()) return s;
  117. for (int i = 0; i < s.size(); i++)
  118. {
  119. if (s[i] != ' ' && s[i] != '\t' &&s[i] != '\n' && s[i] != '\r' && s[i] != '\f')
  120. {
  121. s.erase(0,i);
  122. break;
  123. }
  124. }
  125. for (int i = s.size() - 1; i > -1; i--)
  126. {
  127. if (s[i] != ' ' && s[i] != '\t' &&s[i] != '\n' && s[i] != '\r' && s[i] != '\f')
  128. {
  129. s.erase(i + 1);
  130. break;
  131. }
  132. }
  133. return s;
  134. }
  135.  
  136. void test3()
  137. {
  138. char val[1000] = { 0 };
  139. char key[1000] = { 0 };
  140.  
  141. ifstream fin("1.txt");
  142. string line;
  143. if (fin)
  144. {
  145. while (getline(fin,line)) // line中不包括每行的换行符
  146. {
  147. cout << line << endl;
  148.  
  149. /// 提取等号之前的内容
  150. // 第1组()表示任意个空格字符,第2组()表示单词(可带_或-),
  151. // 第3组()表示1个以上的空格字符(或=),最后以任意字符串结尾
  152. regex reg("^([\\s]*)([\\w\\-\\_]+)([\\s=]+).*$");
  153. // 取第2组代替原串
  154. string key = regex_replace(line,reg,"$2");
  155. cout << " key: {" << key << "}" << endl;
  156.  
  157. /// 提取等号之后的内容
  158. // 第1组()表示任意个空格字符,第2组()表示单词(可带_或-),第4组()表示任意个字符除换行符外,
  159. // 第5组()表示以任意个空格字符(或回车换行符)结尾。
  160. reg = regex("^([\\s]*)([\\w\\-\\_]+)([\\s=]+)(.*)([\\s]*)$");
  161. // 取第4组代替原串
  162. string val = trim(regex_replace(line,"$4"));
  163. cout << " val: {" << val << "}" << endl;
  164.  
  165. // 去除两边双引号
  166. // ...
  167. // 插入map
  168. // map[key]=value;
  169. // string 转 其它类型
  170. // int i = parseTo<int>("123");
  171. // float f = parseTo<float>("1.23");
  172. // string str = parseTo<string>(123);
  173. }
  174. }
  175. else // 没有该文件
  176. {
  177. cout << "no such file" << endl;
  178. }
  179. }
  180.  
  181. void main()
  182. {
  183. //test1();
  184. test2();
  185. test3();
  186. }
  187.  
  188. void lTrim(char * str)
  189. {
  190. int i,len;
  191.  
  192. len = strlen(str);
  193. for (i = 0; i<len; i++)
  194. {
  195. if (str[i] != ' ' && str[i] != '\t' && str[i] != '\n' && str[i] != '\r' && str[i] != '\f') break;
  196. }
  197. memmove(str,str + i,len - i + 1);
  198. return;
  199. }
  200.  
  201. void rTrim(char * str)
  202. {
  203. int i,len;
  204.  
  205. len = strlen(str);
  206. for (i = len - 1; i >= 0; i--)
  207. {
  208. if ((str[i] != ' ') && (str[i] != 0x0a) && (str[i] != 0x0d) && (str[i] != '\t') && (str[i] != '\f')) break;
  209. }
  210. str[i + 1] = 0;
  211. return;
  212. }
  213.  
  214. void Trim(char * str)
  215. {
  216. int i,len;
  217.  
  218. //先去除左边的空格
  219. len = strlen(str);
  220. for (i = 0; i<len; i++)
  221. {
  222. if (str[i] != ' ' && str[i] != '\t' && str[i] != '\n' && str[i] != '\r' && str[i] != '\f') break;
  223. }
  224. memmove(str,len - i + 1);
  225.  
  226. //再去除右边的空格
  227. len = strlen(str);
  228. for (i = len - 1; i >= 0; i--)
  229. {
  230. if (str[i] != ' ' && str[i] != '\t' && str[i] != '\n' && str[i] != '\r' && str[i] != '\f') break;
  231. }
  232. str[i + 1] = 0;
  233.  
  234. return;
  235. }
  236. /* void Trim(char * str) { lTrim(str); rTrim(str); } */

猜你在找的正则表达式相关文章