最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt QRegularExpression正則類的使用小結(jié)

 更新時間:2026年07月09日 09:26:27   作者:華麗的周遭  
本文主要介紹了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++控制臺強化如何實現(xiàn)一定界面效果(簡潔版)

    C++控制臺強化如何實現(xiàn)一定界面效果(簡潔版)

    這篇文章主要介紹了C++控制臺強化如何實現(xiàn)一定界面效果(簡潔版),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C語言strlen和sizeof在數(shù)組中的使用詳解

    C語言strlen和sizeof在數(shù)組中的使用詳解

    對于 strlen 和 sizeof,相信不少程序員會混淆其功能。雖然從表面上看它們都可以求字符串的長度,但二者卻存在著許多不同之處及本質(zhì)區(qū)別
    2021-10-10
  • C語言實現(xiàn)日期和時間處理的常用函數(shù)總結(jié)

    C語言實現(xiàn)日期和時間處理的常用函數(shù)總結(jié)

    在C語言中,時間和日期處理是一項非?;A的技能,也是開發(fā)實際應用程序時經(jīng)常會用到的功能,本文為大家總結(jié)了C語言中一些常用的時間庫函數(shù),希望對大家有所幫助
    2023-06-06
  • C語言輸入三角形邊長判斷其類型并輸出面積實例代碼

    C語言輸入三角形邊長判斷其類型并輸出面積實例代碼

    這篇文章主要介紹了C語言輸入三角形邊長判斷其類型并輸出面積實例代碼,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • C++?using?編譯指令與名稱沖突問題

    C++?using?編譯指令與名稱沖突問題

    using?編譯指令由名稱空間名和它前面的關(guān)鍵字?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++實現(xiàn)圖的鄰接矩陣表示

    C++實現(xiàn)圖的鄰接矩陣表示

    這篇文章主要為大家詳細介紹了C++實現(xiàn)圖的鄰接矩陣表示,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C++連接mysql數(shù)據(jù)庫(改進版)

    C++連接mysql數(shù)據(jù)庫(改進版)

    C++是大家都非常熟悉的,也是大家平時辦公中經(jīng)常會用到的,下面這篇文章主要給大家介紹了關(guān)于C++連接mysql數(shù)據(jù)庫的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • 使用matlab繪制七夕表白玫瑰花束

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

    又是一年七夕節(jié)要到了,每年一次直男審美MATLAB繪圖大賽開始了,于是今年對我之前寫的老代碼進行了點優(yōu)化組合,整了個花球變花束,感興趣的小伙伴可以動手試一試
    2023-08-08

最新評論

涡阳县| 平山县| 南阳市| 利川市| 伊金霍洛旗| 府谷县| 塔河县| 桐庐县| 梁山县| 特克斯县| 电白县| 屏东市| 天等县| 中西区| 错那县| 新余市| 东城区| 三亚市| 永春县| 林周县| 高唐县| 蒙城县| 嘉黎县| 辽阳县| 岑巩县| 海林市| 雷州市| 佳木斯市| 普安县| 田东县| 潮州市| 顺平县| 阜阳市| 曲松县| 松桃| 淳化县| 仁布县| 大厂| 闸北区| 寻乌县| 龙门县|