QT5中使用QRegularExpression代替QRegExp方法代码

 更新时间:2024年04月29日 09:06:31   作者:岭峰翊曈  
这篇文章主要给大家介绍了关于QT5中使用QRegularExpression代替QRegExp的相关资料,正则表达式(regep)是处理字符串和文本的强大工具,验证regexp可以测试子字符串是否满足某些条件,例如是整数或不包含空格,需要的朋友可以参考下

前言

今天遇到一个奇怪的问题,在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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • C++ Thread实现简单的socket多线程通信

    C++ Thread实现简单的socket多线程通信

    本文主要介绍了C++ Thread实现简单的socket多线程通信,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • C++11引入的STL中的unordered系列关联式容器

    C++11引入的STL中的unordered系列关联式容器

    STL中的unordered系列容器是C++11引入的基于哈希表实现的关联式容器,STL unordered系列容器基于哈希表,支持快速查找但遍历效率低,适用于无序场景;树形容器基于红黑树,有序且性能稳定,适用于需要有序的场景
    2025-10-10
  • floyd算法实现思路及实例代码

    floyd算法实现思路及实例代码

    这篇文章主要介绍了floyd算法实现思路及实例代码,有需要的朋友可以参考一下
    2014-01-01
  • Qt重写QTreeView自绘实现酷炫样式

    Qt重写QTreeView自绘实现酷炫样式

    QTreeView,顾名思义,就是一种树形的控件,在我们需要做类似于文件列表的视图时,是一个不错的选择,下面我们就来看看qt如何重写QTreeView实现酷炫样式,感兴趣的可以了解一下
    2023-08-08
  • C++中的strcmp函数

    C++中的strcmp函数

    strcmp函数是C++标准库中用于字符串比较的重要函数,在C++中,字符串比较是一项常见的操作,用于判断两个字符串是否相等或者大小关系,本文介绍C++中的strcmp函数,感兴趣的朋友一起看看吧
    2024-03-03
  • C++访问std::variant类型数据的几种方式小结

    C++访问std::variant类型数据的几种方式小结

    std::variant是 C++17中引入的一个新的类模板,提供了一种存储不同类型的值的方式,本文主要介绍了C++访问std::variant类型数据的几种方式小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • C++11计时器之chrono库简介

    C++11计时器之chrono库简介

    C++11有了chrono库,可以在不同系统中很容易的实现定时功能,要使用chrono库,需要#include,其所有实现均在std::chrono namespace下,本文给大家介绍C++11计时器:chrono库介绍,感兴趣的朋友一起看看吧
    2023-12-12
  • 利用Matlab绘制一款专属进度条

    利用Matlab绘制一款专属进度条

    MATLAB自带的进度条是很简单的,这样的进度条显得冷冰冰的。因此,本文将用Matlab来DIY一款专属的进度条,感兴趣的小伙伴可以了解一下
    2022-02-02
  • 关于函数调用方式__stdcall和__cdecl详解

    关于函数调用方式__stdcall和__cdecl详解

    下面小编就为大家带来一篇关于函数调用方式__stdcall和__cdecl详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • c++的构造函数使用方式

    c++的构造函数使用方式

    这篇文章主要介绍了c++的构造函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05

最新评论