Qt5正则读取解析struct内容

20 阅读1分钟

2022-03-27 23:23:55

代码

#include <QCoreApplication>
#include<QRegularExpression>
#include<QFile>
#include<QTextStream>
//获得结构体名称
QString getStructName(const QString& strStruct)
{
    QRegularExpression findStructName(R"(struct\s+(?<name>\w+))");

    QRegularExpressionMatch  match =findStructName.match(strStruct);

    if(match.hasMatch()){
        QString name =match.captured("name");
        return name;
    }
    return "";
}
//获得成员变量,名称-类型
QMap<QString,QString> getStructMember (const QString&strStruct)
{
    QMap<QString,QString>name_type;
    QRegularExpression findStructItemLine (R"(\s(?<type0>((\w+)|(\w+\s+\w+)))\s+(?<name>\w+);)");

    QRegularExpressionMatchIterator i= findStructItemLine.globalMatch(strStruct,0);
    while(i.hasNext()){
        QRegularExpressionMatch  match=i. next();
        if(match.hasMatch()){
            QString type0 =match.captured("type0");
            QString name=match.captured("name");
            name_type[name]=type0;
        }
    }
    return name_type;
}



void getStruct(){

    QFile file("/home/sun/1.h");
    if(!file.open(QFile::ReadOnly)){
        return ;
    }
    QTextStream in(&file);
    QString content=in.readAll();
    QRegularExpression findStruct (R"(struct.*\};)",QRegularExpression::DotMatchesEverythingOption | QRegularExpression::InvertedGreedinessOption);

    QRegularExpressionMatchIterator i= findStruct.globalMatch(content,0, QRegularExpression::PartialPreferCompleteMatch);
    while(i.hasNext()){
        QRegularExpressionMatch  match=i. next();
        if(match.hasMatch()){
            QString strStruct =match.captured(0);
            QString name= getStructName (strStruct);
            QMap<QString,QString> name_type= getStructMember (strStruct);
        }
    }
}

int main(int argc, char*argv[])
{
    getStruct();
    QCoreApplication a (argc, argv);

}

测试文件

struct A
{
 int a;//da
 unsigned short b;
};

struct B
{
 	A a;
 	 unsigned short b;
};

总结

代码不是很通用,注释如果类似代码的情况可能不行,通用方法应该按编译原理来,就当学正则了。