Qt5正则读取解析struct内容

Qt5正则读取解析struct内容,第1张

代码
#include 
#include
#include
#include
//获得结构体名称
QString getStructName(const QString& strStruct)
{
    QRegularExpression findStructName(R"(struct\s+(?\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(?((\w+)|(\w+\s+\w+)))\s+(?\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;
};

总结

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


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/562352.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-01
下一篇 2022-04-01

发表评论

登录后才能评论

评论列表(0条)

保存