1.QRegExp
qt5.0版本之前正则表示示类是QRegExp,通过它能够筛选出我们想要的数据,它的构造函数如下所示:
QRegExp::QRegExp(const QString &pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive, QRegExp::PatternSyntax syntax);
其中QRegExp::PatternSyntax syntax用于解释模式含义的语法,默认选择QRegExp::RegExp,主要参数如下所示:
1.1 QRegExp::RegExp参数
元字符使用示例:
^\d{5,12}$ // 匹配数字(比如qq号),必须为5位到12位数字"^-?\d+$" //匹配整数,可以为负数"^(-?\d+)(\.\d+)?$" //匹配浮点数
"^\d+$" //匹配非负整数"^\d+(\.\d+)?$" //匹配非负整数"^[A-Za-z]+$" //匹配大小写英文字母
2. 使用示例如下所示
/*只能匹配整数,\\d表示转义字符,C++用\\来表示\ */QRegExp regx("^-?\\d+$");QValidator *validator = new QRegExpValidator(regx, this );ui->lineEdit->setValidator( validator ); //设置lineEdit只能输入数字QStringList list;list<<"123";list<<"123A456";list<<"555a";list<<"89d";list<<"3695x";list<<"69";list<<"78.9";foreach(QString s, list.filter(regx)){ //匹配字符串listqDebug()<<s; //过滤数字,只打印123、69}//检索str时QString str = "-123";qDebug()<<str.contains(regx); //返回trueQRegExp regx2("-?\\d+");str = "number : -123xx";qDebug()<<str.indexOf(regx2); //"-123"的位置在索引9上, QRegExp的缺点就是匹配到起始索引后,无法得到终点索引.
正则表达式讲解链接:正则表达式30分钟入门教程
QRegularExpressionMatch match(const QString &subject, //被匹配的目标字符串int offset = 0, //匹配的字符串起始位置MatchType matchType = NormalMatch, //匹配类型MatchOptions matchOptions = NoMatchOption) const;// 匹配选项
QRegularExpression re("(\\d+)/(\\d+)/(\\d+)");QRegularExpressionMatch match = re.match("1999/12/11");if (match.hasMatch()) {for(int i = 0; !match.captured(i).isEmpty(); i++){qDebug()<<"index="<<i<<",str="<<match.captured(i)<<",offset:"<<match.capturedStart(i)<<match.capturedEnd(i);}}
打印如下所示:
index= 0 ,str= "1999/12/11" ,offset: 4 14index= 1 ,str= "1999" ,offset: 4 8index= 2 ,str= "12" ,offset: 9 11index= 3 ,str= "11" ,offset: 12 14
因为() 表示一个集合,所以除了匹配(\\d+)/(\\d+)/(\\d+)外,还会再次匹配3个圆括号里的内容,所以就有4个captured
4、输入QString类型数据,判定其类型
代码如下
QString Qdata=dataOP[0][2];bool isDigital=Qdata.contains(QRegExp("^\\d+$"));//是否为纯数字 例如12345678if(isDigital){DataType="int";auto ddata=Qdata.toInt();}else if(Qdata.contains(QRegExp("^(-?\\d+)(\\.\\d+)?$")))//是否为浮点型例如 1234.567{DataType="double";auto ddata=Qdata.toDouble();}else{if(Qdata.toLower()=="true"||Qdata.toLower()=="false"){DataType="bool";bool ddata = true;if(Qdata.toLower()=="false"){ddata = false;}}else//为QString类型{DataType="string";auto ddata=Qdata.toStdString();}}