QT5中使用QRegularExpression代替QRegExp方法代码
作者:岭峰翊曈
前言
今天遇到一个奇怪的问题,在qt5.12版本中使用正则QRegExp regx.setPattern(“[0-9]{10}”);去匹配一个十个连续数字,神奇的出现了在Debug调试模式下,匹配字符串 ”D:/Project/bin/输液监控0571001001.db“无法通过,在release模式下,可以匹配通过,并获取到“0571001001”字符串。带着这个我问题我上网查了一些资料。发现是QRegExp不支持反向预查,并且大家都有弃用QRegExp启用QRegularExpression,原因有QRegExp它具有笨拙的API,运行缓慢,错误,无法维护,支持perl regexp功能的非常有限子集,以此类推。QRegularExpression是Qt5加入的,QRegularExpression相比与QRegExp几乎完全兼容了perl的RegExp引用。且似乎处理了QRegExp中的错误。
QRegExp类简介
QRegExp类是qt框架的一部分,很早以前就引入了(QT4.2)。其基本使用如
- matchedLength() : 匹配的长度
- capturedTexts() : 捕捉到的字符串列表
- captureCount() : 获取表达式中含有的捕捉组的数组
- cap(0) : 表示匹配的整个文本的值
- cap(1) : 表示第一个圆括号中的值
- cap(2) : 表示第二个圆括号中的值
- pos(int n) : 第n个组的位置 默认值为0
- indexIn() : 搜索字符串以找到匹配的字串,返回索引值,失败返回-1
QRegExp rx("(.*)=(.*)"); QString str = ("a=101"); int pos = rx.indexIn(str); if(pos>=0) { qDebug()<<rx.matchedLength(); //5 qDebug()<<rx.capturedTexts(); //("a=101", "a", "101") qDebug()<<rx.cap(0);//"a=101" qDebug()<<rx.cap(1);//"a" qDebug()<<rx.cap(2);//"101" qDebug()<<rx.pos(0);//0 qDebug()<<rx.pos(1);//0 qDebug()<<rx.pos(2);//2 }
QRegularExpression类简介
QRegularExpression是在qt5.0引入,使用正则表达式提供模式匹配。
正则表达式是处理字符串和文本的非常强大的工具。
QRegularExpression 实现的正则表达式完全支持 Unicode。一个正则表达式由两部分组成:一个模式字符串和一组改变模式字符串含义的模式选项。
为了执行匹配,可以简单地调用 match() 函数,传递要匹配的字符串。match() 函数的结果是一个 QRegularExpressionMatch 对象,可用于检查匹配结果。
// 匹配两个数字后跟一个空格和一个单词 QRegularExpression re("\\d\\d \\w+"); QRegularExpressionMatch match = re.match("abc123 def"); bool hasMatch = match.hasMatch(); // true
如果匹配成功,(隐式)捕获组编号 0 可用于检索与整个模式字符串匹配的子字符串:
QRegularExpression re("\\d\\d \\w+"); QRegularExpressionMatch match = re.match("abc123 def"); if (match.hasMatch()) { QString matched = match.captured(0); // matched == "23 def" // do it }
与QRegExp 的主要用法区别
QRegExp 的匹配结果存放在QRegExp对象自身:
QString QRegExp::cap(int nth = 0) const;
而QRegularExpression 类只用来检索匹配,把检索结果单列出来,成为一个类QRegularExpressionMatch;
QString QRegularExpressionMatch::captured(int nth = 0) const;
推测:这样以来,QRegularExpression 检索的负担减小,效率因此提高;
总结
到此这篇关于QT5中使用QRegularExpression代替QRegExp的文章就介绍到这了,更多相关QT5用QRegularExpression代替QRegExp内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!