Qt QRegularExpression正则类的使用小结

 更新时间:2026年07月09日 09:26:27   作者:华丽的周遭  
本文主要介绍了Qt QRegularExpression正则类的使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在Qt5中,QRegularExpression是处理字符串匹配和提取的核心工具。

以下是 QRegularExpression的深度详解:

1. 为什么要用 QRegularExpression?(历史背景)

在 Qt 5 之前,Qt 使用的是 QRegExp。但在新的Qt项目中,强烈建议使用 QRegularExpression

特性

QRegExp (旧)

QRegularExpression (新)

引擎

Qt 自定义实现

PCRE (Perl Compatible Regular Expressions)

性能

较慢,功能有限

快,支持复杂回溯

标准性

Qt 独有语法

兼容 Perl / Python / JavaScript 语法

维护状态

已废弃 (Deprecated)

推荐使用

结论:在资源受限的嵌入式平台,正则匹配效率直接影响 UI 响应速度,QRegularExpression是唯一选择。

2. 核心类结构

主要涉及三个类:

  • QRegularExpression:定义规则(Pattern)。
  • QRegularExpressionMatch:存储单次匹配结果。
  • QRegularExpressionMatchIterator:存储多次匹配结果(全局匹配)。

3. 基础用法:匹配与捕获

3.1 简单匹配

#include <QRegularExpression>
#include <QDebug>

QString text = "Video Resolution: 1920x1080 @ 60Hz";
QRegularExpression re("(\\d{4})x(\\d{4})");

QRegularExpressionMatch match = re.match(text);
if (match.hasMatch()) {
    QString width = match.captured(1);  // "1920"
    QString height = match.captured(2); // "1080"
}

3.2 捕获组 (Capture Groups)

这是流媒体协议解析中最常用的功能(例如解析 SDP 或 RTSP 头):

  • captured(0):整个匹配的字符串。
  • captured(1):第一个括号里的内容。

4. 高级特性

4.1 贪婪与非贪婪匹配

在处理不定长的数据流(如 JSON 或 XML 片段)时非常重要。

QString data = "<video>4K</video><audio>AAC</audio>";

// 贪婪匹配(默认):会匹配到最后一个 </xxx>
QRegularExpression greedyRe("<video>.*</video>");
// 非贪婪匹配:只匹配到第一个结束标签
QRegularExpression lazyRe("<video>.*?</video>");

4.2 命名捕获(Named Capturing Groups)

强烈推荐用于协议解析,代码可读性极高,不怕以后正则改顺序。

QRegularExpression re(
    "^(?<type>\\w+)://"
    "(?<ip>\\d+\\.\\d+\\.\\d+\\.\\d+):"
    "(?<port>\\d+)$"
);

QRegularExpressionMatch match = re.match("rtsp://192.168.1.100:554");
if (match.hasMatch()) {
    qDebug() << "Type:" << match.captured("type"); // rtsp
    qDebug() << "IP:"   << match.captured("ip");   // 192.168.1.100
    qDebug() << "Port:" << match.captured("port"); // 554
}

应用场景:解析 RTSP/HTTP/SRT 地址字符串。

5. 全局匹配(Global Matching)

当你需要从一段日志或 NALU 流中提取所有关键信息时使用。

QString logData = "Pkt:123 Size:1500\nPkt:124 Size:1450";
QRegularExpression re("Pkt:(\\d+) Size:(\\d+)");

QRegularExpressionMatchIterator it = re.globalMatch(logData);
while (it.hasNext()) {
    QRegularExpressionMatch match = it.next();
    qDebug() << "Packet" << match.captured(1) 
             << "Size" << match.captured(2);
}

6. 性能优化(针对嵌入式 Linux)

在嵌入式linux上运行 Qt 应用时,正则表达式是 CPU 密集型操作,需注意以下几点:

6.1 预编译(Optimize)

最重要的一点:不要在循环里创建 QRegularExpression对象。

// ❌ 错误示范:每次调用都会重新编译正则
void badParse(QString data) {
    QRegularExpression re("pattern"); // 开销大
    ...
}

// ✅ 正确做法:使用静态变量或成员变量
void goodParse(QString data) {
    static const QRegularExpression re("pattern"); // 只编译一次
    ...
}

6.2 设置匹配选项

QRegularExpression re("pattern");
re.setPatternOptions(QRegularExpression::DotMatchesEverythingOption |
                    QRegularExpression::DontCaptureOption); // 不捕获提高效率

7. 在 Qt Widgets / 输入验证中的应用

你可能需要限制用户输入(如 IP 地址、端口号)。

7.1 QLineEdit 输入校验

QLineEdit *ipInput = new QLineEdit(this);
QRegularExpression ipRegex(
    "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}"
    "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"
);
QValidator *validator = new QRegularExpressionValidator(ipRegex, this);
ipInput->setValidator(validator);

总结

  • 放弃 QRegExp,全面使用 QRegularExpression
  • 善用命名捕获,让协议解析代码更易维护。
  • 注意性能,将QRegularExpression对象定义为 static const或类成员。
  • 结合 GStreamer​ 调试时,用 Regex 过滤 Pipeline 日志非常高效。

到此这篇关于Qt QRegularExpression正则类的使用小结的文章就介绍到这了,更多相关Qt QRegularExpression正则内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++控制台强化如何实现一定界面效果(简洁版)

    C++控制台强化如何实现一定界面效果(简洁版)

    这篇文章主要介绍了C++控制台强化如何实现一定界面效果(简洁版),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • C语言strlen和sizeof在数组中的使用详解

    C语言strlen和sizeof在数组中的使用详解

    对于 strlen 和 sizeof,相信不少程序员会混淆其功能。虽然从表面上看它们都可以求字符串的长度,但二者却存在着许多不同之处及本质区别
    2021-10-10
  • C语言实现日期和时间处理的常用函数总结

    C语言实现日期和时间处理的常用函数总结

    在C语言中,时间和日期处理是一项非常基础的技能,也是开发实际应用程序时经常会用到的功能,本文为大家总结了C语言中一些常用的时间库函数,希望对大家有所帮助
    2023-06-06
  • C语言输入三角形边长判断其类型并输出面积实例代码

    C语言输入三角形边长判断其类型并输出面积实例代码

    这篇文章主要介绍了C语言输入三角形边长判断其类型并输出面积实例代码,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • C++ using 编译指令与名称冲突问题

    C++ using 编译指令与名称冲突问题

    using 编译指令由名称空间名和它前面的关键字 using namespace 组成,它使名称空间中的所有名称都可用,而不需要使用作用域解析运算符,这篇文章主要介绍了C++ using 编译指令与名称冲突,需要的朋友可以参考下
    2022-11-11
  • bmp 缩放代码(BMP位图任意放大 和缩小)

    bmp 缩放代码(BMP位图任意放大 和缩小)

    这篇文章主要介绍了bmp 缩放代码(BMP位图任意放大 和缩小),需要的朋友可以参考下
    2016-04-04
  • boost.asio框架系列之socket编程

    boost.asio框架系列之socket编程

    这篇文章介绍了boost.asio框架系列之socket编程,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C++实现图的邻接矩阵表示

    C++实现图的邻接矩阵表示

    这篇文章主要为大家详细介绍了C++实现图的邻接矩阵表示,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C++连接mysql数据库(改进版)

    C++连接mysql数据库(改进版)

    C++是大家都非常熟悉的,也是大家平时办公中经常会用到的,下面这篇文章主要给大家介绍了关于C++连接mysql数据库的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • 使用matlab绘制七夕表白玫瑰花束

    使用matlab绘制七夕表白玫瑰花束

    又是一年七夕节要到了,每年一次直男审美MATLAB绘图大赛开始了,于是今年对我之前写的老代码进行了点优化组合,整了个花球变花束,感兴趣的小伙伴可以动手试一试
    2023-08-08

最新评论