Qt QRegularExpression正則類的使用小結(jié)
在Qt5中,QRegularExpression是處理字符串匹配和提取的核心工具。
以下是 QRegularExpression的深度詳解:
1. 為什么要用 QRegularExpression?(歷史背景)
在 Qt 5 之前,Qt 使用的是 QRegExp。但在新的Qt項目中,強烈建議使用 QRegularExpression:
特性 | QRegExp (舊) | QRegularExpression (新) |
|---|---|---|
引擎? | Qt 自定義實現(xiàn) | PCRE (Perl Compatible Regular Expressions)? |
性能? | 較慢,功能有限 | 快,支持復雜回溯? |
標準性? | Qt 獨有語法 | 兼容 Perl / Python / JavaScript 語法 |
維護狀態(tài)? | 已廢棄 (Deprecated) | 推薦使用? |
結(jié)論:在資源受限的嵌入式平臺,正則匹配效率直接影響 UI 響應速度,QRegularExpression是唯一選擇。
2. 核心類結(jié)構(gòu)
主要涉及三個類:
- QRegularExpression:定義規(guī)則(Pattern)。
- QRegularExpressionMatch:存儲單次匹配結(jié)果。
- QRegularExpressionMatchIterator:存儲多次匹配結(jié)果(全局匹配)。
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)
這是流媒體協(xié)議解析中最常用的功能(例如解析 SDP 或 RTSP 頭):
captured(0):整個匹配的字符串。captured(1):第一個括號里的內(nèi)容。
4. 高級特性
4.1 貪婪與非貪婪匹配
在處理不定長的數(shù)據(jù)流(如 JSON 或 XML 片段)時非常重要。
QString data = "<video>4K</video><audio>AAC</audio>";
// 貪婪匹配(默認):會匹配到最后一個 </xxx>
QRegularExpression greedyRe("<video>.*</video>");
// 非貪婪匹配:只匹配到第一個結(jié)束標簽
QRegularExpression lazyRe("<video>.*?</video>");4.2 命名捕獲(Named Capturing Groups)
強烈推薦用于協(xié)議解析,代碼可讀性極高,不怕以后正則改順序。
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 流中提取所有關(guān)鍵信息時使用。
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. 性能優(yōu)化(針對嵌入式 Linux)
在嵌入式linux上運行 Qt 應用時,正則表達式是 CPU 密集型操作,需注意以下幾點:
6.1 預編譯(Optimize)
最重要的一點:不要在循環(huán)里創(chuàng)建 QRegularExpression對象。
// ? 錯誤示范:每次調(diào)用都會重新編譯正則
void badParse(QString data) {
QRegularExpression re("pattern"); // 開銷大
...
}
// ? 正確做法:使用靜態(tài)變量或成員變量
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);總結(jié)
- 放棄 QRegExp,全面使用
QRegularExpression。 - 善用命名捕獲,讓協(xié)議解析代碼更易維護。
- 注意性能,將
QRegularExpression對象定義為static const或類成員。 - 結(jié)合 GStreamer? 調(diào)試時,用 Regex 過濾 Pipeline 日志非常高效。
到此這篇關(guān)于Qt QRegularExpression正則類的使用小結(jié)的文章就介紹到這了,更多相關(guān)Qt QRegularExpression正則內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言strlen和sizeof在數(shù)組中的使用詳解
對于 strlen 和 sizeof,相信不少程序員會混淆其功能。雖然從表面上看它們都可以求字符串的長度,但二者卻存在著許多不同之處及本質(zhì)區(qū)別2021-10-10
C語言實現(xiàn)日期和時間處理的常用函數(shù)總結(jié)
在C語言中,時間和日期處理是一項非?;A的技能,也是開發(fā)實際應用程序時經(jīng)常會用到的功能,本文為大家總結(jié)了C語言中一些常用的時間庫函數(shù),希望對大家有所幫助2023-06-06

