临时用户3.14159 发表于 2022-4-7 19:13:48

C++ 正则表达式问题

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

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

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

            if(string == '#')      //以‘#’为注释符 若第一个字符为注释符 则直接读取下一行
            {
                continue;
            }
            else
            {
                //否则进行处理
                int indexOfString = 0;
                std::string param;
                std::string value;
                std::regex normalize("*\0"); //整型数字正则表达式(包括空格)

                while(string != '=' || string != ':')   //这里的判断有问题 不过一个二重检测就搞定了 这里我也懒的改
                {
                  //二重检测
                  if(string == '=' || string == ':')
                  {
                        break;
                  }
                  //默认去除所有空格
                  if(string == '')
                  {
                        indexOfString++;
                        continue;
                  }
                  param += string;
                }
                indexOfString++;

                //当遇到'='或者':'时 先读取后面的所有内容
                while(string != '\0')
                {
                  value += string;
                }
                value += '\0';//末尾标识符

                if(develop)
                {
                  std::cout << "\""<<value << "\":" << std::regex_match(value, normalize) << std::endl;
                }

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

                  while(value != '\0')
                  {
                        if(value == '')
                        {
                            j++;
                            continue;
                        }
                        intValue.value += value; //若不为空格 则追加到末尾
                  }

                  if(develop)
                        print(intValue);

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

                  while(value == ' ')
                  {
                        i++;
                  }
                  //若value末尾有空格 则替换为"\0"
                  while(value == ' ')
                  {
                        value = '\0';
                  }

                  StringValue stringValue;
                  stringValue.param = param;

                  while(value != '\0')
                  {
                        stringValue.value += value;
                  }

                  if(develop)
                        print(stringValue);

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

这下面是我测试时的输出内容
# 杩欐槸鎴戠殑娴嬭瘯    //这个单纯编码问题 不用管
path = C:\Users\Administrator.PC-20191006TRUC\source\repos\OpenGL\.vscode\OpenGL\OpenGLTool\OpenGLFile//这个也不用管
" C:\Users\Administrator.PC-20191006TRUC\source\repos\OpenGL\.vscode\OpenGL\OpenGLTool\OpenGLFile":0
path: C:\Users\Administrator.PC-20191006TRUC\source\repos\OpenGL\.vscode\OpenGL\OpenGLTool\OpenGLFile
value = 1 //这个也不用管
" 1":0   //主要是这个 这个字符串理论上应当符合我的正则表达式"*"为什么这个返回的是0
value: 1希望有大佬可以帮助一下

jhq999 发表于 2022-4-8 15:14:40

本帖最后由 jhq999 于 2022-4-8 15:59 编辑

学习

jhq999 发表于 2022-4-8 18:16:43

" 1":0   //主要是这个 这个字符串理论上应当符合我的正则表达式"*"为什么这个返回的是0

有两个双引号和一个冒号,所以不能完全匹配
页: [1]
查看完整版本: C++ 正则表达式问题