#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;
};
总结
代码不是很通用,注释如果类似代码的情况可能不行,通用方法应该按编译原理来,就当学正则了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)