当前位置:

首页 > 编程开发 > QtQRegularExpression正则类的使用小结

QtQRegularExpression正则类的使用小结

Expressions
Expressions

Expressions 是一款美观的正则表达式编辑、测试工具,让编写和测试正则表达式变得简单有趣。阅读、编辑、转换和整理这些常见文档动作都能放在一套流程里完成,不用频繁切换工具。

立即下载
¥30 ¥50
macOS 2026-08-22
正版软件 macOS软件

在Qt5的世界里,QRegularExpression可以说就是正则匹配的“一把手”。无论是字符串提取、格式校验,还是协议解析,它都是绕不开的核心工具。下面,咱们就来拆解一下它的核心用法。 1. 为什么要用 QRegularExpression?(历史背景) 直接说结论:Qt官方已经明确表态,新项目

在Qt5的世界里,QRegularExpression可以说就是正则匹配的“一把手”。无论是字符串提取、格式校验,还是协议解析,它都是绕不开的核心工具。下面,咱们就来拆解一下它的核心用法。

QtQRegularExpression正则类的使用小结

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

直接说结论:Qt官方已经明确表态,新项目首选QRegularExpression,原因无他——性能更强、语法更通用。在Qt 5之前,Qt用的是老旧的QRegExp,但现在已经全面被新方案取代。

特性

QRegExp (旧)

QRegularExpression (新)

引擎​

Qt 自定义实现

PCRE (Perl Compatible Regular Expressions)​

性能​

较慢,功能有限

快,支持复杂回溯​

标准性​

Qt 独有语法

兼容 Perl / Python / Ja vaScript 语法

维护状态​

已废弃 (Deprecated)

推荐使用​

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

2. 核心类结构

简单来说,主要涉及三个类,它们分工明确:

  • QRegularExpression:定义规则(Pattern),相当于正则表达式本身。
  • QRegularExpressionMatch:存储单次匹配结果,包含捕获组等内容。
  • QRegularExpressionMatchIterator:存储多次匹配结果,适合全局匹配场景。

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

3.1 简单匹配

先看一个最基础的例子:从视频分辨率字符串中提取宽高。

#include 
#include 

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 贪婪与非贪婪匹配

这个特性在处理不定长数据流时特别关键,稍不留神就可能匹配出问题。举一个处理XML/JSON片段的例子:

QString data = "";

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

4.2 命名捕获(Named Capturing Groups)

这里必须重点推荐一个功能——命名捕获组。在协议解析中,它能极大提升代码可读性,而且不怕以后调整正则的顺序。来看一个解析RTSP地址的例子:

QRegularExpression re(
    "^(?\w+)://"
    "(?\d+\.\d+\.\d+\.\d+):"
    "(?\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:1500nPkt: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环境下,正则表达式是典型的CPU密集型操作,性能优化必须提到日程上。这里重点提两条:

6.1 预编译

首要原则:不要在循环里反复创建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地址、端口号。QRegularExpression结合QValidator可以轻松实现。

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调试,用正则过滤Pipeline日志能大幅提升排查效率。
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发
相关文章 更多
NVM Express 发布 11 项规范集更新,NVMe 基本规范来到 2.4 版本
NVM Express 发布 11 项规范集更新,NVMe 基本规范来到 2.4 版本

NVMExpress在FMS2026发布11项规范集更新,NVMe基本规范升级至2.4版本。新规范增强后量子密码学安全性,通过虚拟化简化虚拟机迁移,支持主控端速率控制、电压遥测监控及恢复出厂设置,提升设备管理与可持续性,适应企业、云、AI及客户端环境。

三星P9 Express固态存储卡荣获2026年第十一届
三星P9 Express固态存储卡荣获2026年第十一届

三星P9Express固态存储卡获2026年ChinaJoy黑金奖,具超高速、大容量、高稳定性,兼容性强,针对Switch2优化,兼顾游戏体验与视频剪辑渲染等专业工作,为游戏和专业用户提供高效存储方案。

VSCode中Express项目结合Node环境下的Session持久化(Redis)调试
VSCode中Express项目结合Node环境下的Session持久化(Redis)调试

VSCode调试Express与RedisSession时,常见问题包括Redis连接失败(未启动或localhost指向错误)、connect-redis初始化未传client实例、cookie安全策略设置不当导致失效。需确认Redis服务运行、客户端连接成功、中间件顺序正确及cookie配置适配开发环境。

SellingExpress批量上传ebay有哪些技巧-SellingExpress批量上传ebay的技巧是什么
SellingExpress批量上传ebay有哪些技巧-SellingExpress批量上传ebay的技巧是什么

在eBay上做销售,时间就是金钱。要想提高效率,批量上传工具SellingExpress绝对是个好帮手。不过,工具再好,也得会用——下面这些技巧,都是实战中总结出来的,值得收藏。 第一步,商品信息得准备得扎扎实实。图片要清晰,能展示全貌和细节;描述要详细,把产品的优势和特点说透;价格要合理,分类要准

VSCode中Node环境针对Express/Koa中间件异常的链路诊断
VSCode中Node环境针对Express/Koa中间件异常的链路诊断

调试Node服务时,断点不触发常因请求未进入中间件栈、launch.json入口配置错误或启动阶段异常。应验证请求是否进入中间件链,确保program指向可执行.js文件,推荐用attach模式调试Web服务,并检查启动时模块加载与环境变量问题。

Node.jsExpress中间件理解及中间件分类和作用
Node.jsExpress中间件理解及中间件分类和作用

Express中间件作为HTTP请求拦截器,组成处理链。分为应用程序级(全局通用逻辑)、路由级(模块专属)、错误处理(四参数捕获异常)、内置(静态资源、JSON/表单解析)及第三方(验证、文件上传、跨域)等类型,实现解耦与复用。

Photoshop Express美颜技巧有哪些
Photoshop Express美颜技巧有哪些

想让照片里的人像看起来更精致、更有神采,但又不想让修图痕迹太过明显?Photoshop Express的美颜功能或许能帮上大忙。它操作直观,效果自然,即便是新手也能快速上手,打造出令人满意的照片效果。 一、快速入门美颜 打开Photoshop Express并导入照片后,直接找到编辑界面里的“美颜”

首款雷电 5 认证四盘位 M.2 固态硬盘盒 OWC 发布 Express 4M2 Ultra
首款雷电 5 认证四盘位 M.2 固态硬盘盒 OWC 发布 Express 4M2 Ultra

OWC推出首款雷电5认证四盘位M.2固态硬盘盒Express 4M2 Ultra 在今年的NAB 2026广播电视展会上,存储解决方案厂商OWC带来了一款重磅新品——全球首款获得雷电5认证的四盘位M.2固态硬盘盒Express 4M2 Ultra。这款产品瞄准的,正是那些对存储性能有着极致要求的专业

Express连接MySQL及数据库连接池的示例分析
Express连接MySQL及数据库连接池的示例分析

Express连接MySQL准备工作打开webstorm新建项目选择express创建一个express项目。创建成功后其页面如下:为了连接mysql数据库还需要导入mysql模块。创建配置文件在项目中创建config文件,在config文件中创建congfigdb.js文件用来连接数据库,在文件中写入:varmysql={host:"127.0.0.1",//这是数据库的地址user:"root",//需要用户的名字password:"root23",//用户密码,如果你没有密码,直接双引号就是data

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
Postman macOS版
Postman macOS版
Mac

Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。

Docker Desktop macOS版
Docker Desktop macOS版
Mac

Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。

Android Studio macOS版
Android Studio macOS版
Mac

Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。

WINDOWS 更多
Postman Windows版
Postman Windows版
Windows

Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等

Docker Desktop Windows版
Docker Desktop Windows版
Windows

Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。

Android Studio Windows版
Android Studio Windows版
Windows

Android Studio 是 Google 面向 Android 应用开发提供的官方集成开发环境,以 IntelliJ IDEA 为基础,集成智能代码编辑、Gradle 构建、设备模拟、界面预览、调试测试及性能分析工具,

即将离开本站
您即将前往第三方网站,请确认是否继续?