鱼C论坛

 找回密码
 立即注册
查看: 1390|回复: 2

C++ 正则表达式问题

[复制链接]
发表于 2022-4-7 19:13:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本人自己再写处理.ini文件的类时,需要使用到正则表达式 可是C++的正则表达式比较函数regex_match给我的结果与我想的完全不一样

这下面是我类的主要代码
  1. void readFile()
  2.     {
  3.         file.open(filename, std::ios::in);

  4.         while(!file.eof())  //当不是在文件末尾时 继续读取
  5.         {
  6.             std::string string;
  7.             std::getline(file, string);
  8.             if(develop)
  9.                 std::cout << string << std::endl;
  10.             
  11.             string += '\0';     //末尾标识符

  12.             if(string[0] == '#')        //以‘#’为注释符 若第一个字符为注释符 则直接读取下一行
  13.             {
  14.                 continue;
  15.             }
  16.             else
  17.             {
  18.                 //否则进行处理
  19.                 int indexOfString = 0;
  20.                 std::string param;
  21.                 std::string value;
  22.                 std::regex normalize("[0-9|\\s]*\0"); //整型数字正则表达式(包括空格)

  23.                 while(string[indexOfString] != '=' || string[indexOfString] != ':')   //这里的判断有问题 不过一个二重检测就搞定了 这里我也懒的改
  24.                 {
  25.                     //二重检测
  26.                     if(string[indexOfString] == '=' || string[indexOfString] == ':')
  27.                     {
  28.                         break;
  29.                     }
  30.                     //默认去除所有空格
  31.                     if(string[indexOfString] == '  ')
  32.                     {
  33.                         indexOfString++;
  34.                         continue;
  35.                     }
  36.                     param += string[indexOfString++];
  37.                 }
  38.                 indexOfString++;

  39.                 //当遇到'='或者':'时 先读取后面的所有内容
  40.                 while(string[indexOfString] != '\0')
  41.                 {
  42.                     value += string[indexOfString++];
  43.                 }
  44.                 value += '\0';  //末尾标识符

  45.                 if(develop)
  46.                 {
  47.                     std::cout << """<<value << "":" << std::regex_match(value, normalize) << std::endl;
  48.                 }

  49.                 //若为真 则说明数据为整型数据
  50.                 if(std::regex_match(value, normalize))   ///////////////////    这里有问题
  51.                 {
  52.                     IntValue intValue;
  53.                     intValue.param = param;
  54.                     int j = 0;  //去空格用

  55.                     while(value[j] != '\0')
  56.                     {
  57.                         if(value[j] == '  ')
  58.                         {
  59.                             j++;
  60.                             continue;
  61.                         }
  62.                         intValue.value += value[j]; //若不为空格 则追加到末尾
  63.                     }

  64.                     if(develop)
  65.                         print(intValue);

  66.                     add(intValue);  //添加至链表
  67.                 }
  68.                 //若为假 则说明数据为字符串数据
  69.                 else
  70.                 {
  71.                     //去除字符串两头的空格即可
  72.                     int i = 0, j = value.length() - 2;

  73.                     while(value[i] == ' ')
  74.                     {
  75.                         i++;
  76.                     }
  77.                     //若value末尾有空格 则替换为"\0"
  78.                     while(value[j] == ' ')
  79.                     {
  80.                         value[j--] = '\0';
  81.                     }

  82.                     StringValue stringValue;
  83.                     stringValue.param = param;

  84.                     while(value[i] != '\0')
  85.                     {
  86.                         stringValue.value += value[i++];
  87.                     }

  88.                     if(develop)
  89.                         print(stringValue);

  90.                     add(stringValue);   //添加至链表
  91.                 }
  92.             }
  93.         }
复制代码
然后这里是我测试用的.ini文件的内容
  1. # 这是我的注释测试
  2. path = C:\Users\Administrator.PC-20191006TRUC\source\repos\OpenGL\.vscode\OpenGL\OpenGLTool\OpenGLFile
  3. value = 1
复制代码
然后主要问题就是当我代码中的 value 变量的值为 " 1"(“1”的前面是一个空格)的时候 正则表达式的比较函数仍然返回0 这是我搞不懂的

这下面是我测试时的输出内容
  1. # 杩欐槸鎴戠殑娴嬭瘯    //这个单纯编码问题 不用管
  2. path = C:\Users\Administrator.PC-20191006TRUC\source\repos\OpenGL\.vscode\OpenGL\OpenGLTool\OpenGLFile  //这个也不用管
  3. " C:\Users\Administrator.PC-20191006TRUC\source\repos\OpenGL\.vscode\OpenGL\OpenGLTool\OpenGLFile":0
  4. path: C:\Users\Administrator.PC-20191006TRUC\source\repos\OpenGL\.vscode\OpenGL\OpenGLTool\OpenGLFile
  5. value = 1 //这个也不用管
  6. " 1":0   //主要是这个 这个字符串理论上应当符合我的正则表达式"[0-9|\s]*"  为什么这个返回的是0
  7. value: 1
复制代码
希望有大佬可以帮助一下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-4-8 15:14:40 | 显示全部楼层
本帖最后由 jhq999 于 2022-4-8 15:59 编辑

学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-4-8 18:16:43 | 显示全部楼层
" 1":0   //主要是这个 这个字符串理论上应当符合我的正则表达式"[0-9|\s]*"  为什么这个返回的是0

有两个双引号和一个冒号,所以不能完全匹配
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-24 09:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表