#include测试文件#include #include #include //获得结构体名称 QString getStructName(const QString& strStruct) { QRegularexpression findStructName(R"(structs+(? w+))"); QRegularexpressionMatch match =findStructName.match(strStruct); if(match.hasMatch()){ QString name =match.captured("name"); return name; } return ""; } //获得成员变量,名称-类型 QMap getStructMember (const QString&strStruct) { QMap 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 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;
};
总结
代码不是很通用,注释如果类似代码的情况可能不行,通用方法应该按编译原理来,就当学正则了。



