鱼C论坛

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

C++ 正则表达式问题

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

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

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

x
本人自己再写处理.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[0] == '#')        //以‘#’为注释符 若第一个字符为注释符 则直接读取下一行
            {
                continue;
            }
            else
            {
                //否则进行处理
                int indexOfString = 0;
                std::string param;
                std::string value;
                std::regex normalize("[0-9|\\s]*\0"); //整型数字正则表达式(包括空格)

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

                //当遇到'='或者':'时 先读取后面的所有内容
                while(string[indexOfString] != '\0')
                {
                    value += string[indexOfString++];
                }
                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[j] != '\0')
                    {
                        if(value[j] == '  ')
                        {
                            j++;
                            continue;
                        }
                        intValue.value += value[j]; //若不为空格 则追加到末尾
                    }

                    if(develop)
                        print(intValue);

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

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

                    StringValue stringValue;
                    stringValue.param = param;

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

                    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-9|\s]*"  为什么这个返回的是0
value: 1
希望有大佬可以帮助一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

有两个双引号和一个冒号,所以不能完全匹配
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-7 06:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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