Qt中使用正則表達(dá)式來提取字符串等操作指南
前言
在 C++ Qt 項(xiàng)目中,你可以使用 QRegularExpression 類結(jié)合正則表達(dá)式來匹配 QString 中的內(nèi)容。下面介紹如何使用正則表達(dá)式進(jìn)行匹配、提取和替換操作。
一、基本用法:創(chuàng)建正則表達(dá)式對(duì)象
#include <QRegularExpression>
QString m_buffer = "Hello, 2025! Today is 2025-05-30.";
// 創(chuàng)建正則表達(dá)式對(duì)象(匹配四位數(shù)字)
QRegularExpression re("\\d{4}");
二、常見匹配操作
1. 檢查是否匹配
// 檢查整個(gè)字符串是否匹配 bool isExactMatch = re.match(m_buffer).hasMatch(); // 檢查字符串中是否包含匹配項(xiàng) bool containsMatch = m_buffer.contains(re);
2. 查找第一個(gè)匹配項(xiàng)
QRegularExpressionMatch match = re.match(m_buffer);
if (match.hasMatch()) {
QString matchedText = match.captured(0); // 整個(gè)匹配的文本
int pos = match.capturedStart(0); // 匹配的起始位置
int length = match.capturedLength(0); // 匹配的長(zhǎng)度
}
3. 查找所有匹配項(xiàng)
QRegularExpressionMatchIterator it = re.globalMatch(m_buffer);
while (it.hasNext()) {
QRegularExpressionMatch match = it.next();
QString matchedText = match.captured(0);
// 處理每個(gè)匹配項(xiàng)
}
4. 使用捕獲組提取子字符串
// 匹配日期格式:YYYY-MM-DD
QRegularExpression dateRe("(\\d{4})-(\\d{2})-(\\d{2})");
QRegularExpressionMatch match = dateRe.match(m_buffer);
if (match.hasMatch()) {
QString fullDate = match.captured(0); // 完整匹配:2025-05-30
QString year = match.captured(1); // 第一組:2025
QString month = match.captured(2); // 第二組:05
QString day = match.captured(3); // 第三組:30
}
三、高級(jí)用法
1. 設(shè)置匹配選項(xiàng)
// 不區(qū)分大小寫
QRegularExpression re("hello", QRegularExpression::CaseInsensitiveOption);
// 多行模式(^ 和 $ 匹配行的開始和結(jié)束)
QRegularExpression multiLineRe("^\\d+", QRegularExpression::MultilineOption);
2. 替換匹配內(nèi)容
// 將所有數(shù)字替換為 "X" QString result = m_buffer.replace(re, "X"); // 結(jié)果:"Hello, X! Today is X-X-X." // 使用捕獲組替換 QString replaced = m_buffer.replace(dateRe, "\\1年\\2月\\3日"); // 結(jié)果:"Hello, 2025! Today is 2025年05月30日."
3. 分割字符串
// 按逗號(hào)或空格分割字符串
QRegularExpression splitRe("[,\\s]+");
QStringList parts = m_buffer.split(splitRe);
四、在你的項(xiàng)目中應(yīng)用正則表達(dá)式
假設(shè)你需要從 dbus-monitor 的輸出中提取 time= 后面的時(shí)間戳:
QString m_buffer = "method call time=1748411906.768461 sender=:1.100 ...";
// 正則表達(dá)式:匹配 "time=" 后跟數(shù)字和小數(shù)點(diǎn)
QRegularExpression timeRe("time=(\\d+\\.\\d+)");
QRegularExpressionMatch match = timeRe.match(m_buffer);
if (match.hasMatch()) {
QString timestampStr = match.captured(1); // 提取時(shí)間戳:1748411906.768461
double timestamp = timestampStr.toDouble();
}
五、正則表達(dá)式語(yǔ)法參考
| 符號(hào) | 含義 | 示例 |
|---|---|---|
^ | 匹配字符串開始 | ^hello |
$ | 匹配字符串結(jié)束 | world$ |
. | 匹配任意字符(除換行符) | h.t |
* | 匹配前一個(gè)字符 0 次或多次 | he*llo |
+ | 匹配前一個(gè)字符 1 次或多次 | he+llo |
? | 匹配前一個(gè)字符 0 次或 1 次 | colou?r |
{n} | 匹配前一個(gè)字符 n 次 | a{3} |
{n,} | 匹配前一個(gè)字符至少 n 次 | a{3,} |
{n,m} | 匹配前一個(gè)字符 n 到 m 次 | a{3,5} |
[ ] | 匹配方括號(hào)中的任意字符 | [aeiou] |
[^ ] | 匹配不在方括號(hào)中的任意字符 | [^aeiou] |
( ) | 分組,用于捕獲子字符串 | (\\d{2})-(\\d{2}) |
| | 或操作 | cat|dog |
\d | 匹配數(shù)字(等價(jià)于 [0-9]) | \d{3} |
\D | 匹配非數(shù)字(等價(jià)于 [^0-9]) | \D+ |
\s | 匹配空白字符 | \s+ |
\S | 匹配非空白字符 | \S+ |
\w | 匹配單詞字符(字母、數(shù)字、下劃線) | \w+ |
\W | 匹配非單詞字符 | \W+ |
六、性能注意事項(xiàng)
- 預(yù)編譯正則表達(dá)式:對(duì)于頻繁使用的正則表達(dá)式,建議創(chuàng)建為類成員變量,避免重復(fù)編譯。
- 使用簡(jiǎn)單模式:復(fù)雜的正則表達(dá)式會(huì)顯著影響性能,盡量簡(jiǎn)化。
- 檢查匹配位置:使用
match.capturedStart()確定匹配位置,避免重復(fù)查找。
總結(jié)
到此這篇關(guān)于Qt中使用正則表達(dá)式來提取字符串等操作的文章就介紹到這了,更多相關(guān)Qt正則表達(dá)式提取字符串內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之判斷循環(huán)鏈表空與滿
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之判斷循環(huán)鏈表空與滿的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10
c語(yǔ)言常量定義規(guī)則知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理的是關(guān)于c語(yǔ)言常量定義規(guī)則知識(shí)點(diǎn)總結(jié),需要的朋友們可以學(xué)習(xí)下。2020-03-03
Matlab利用prim算法實(shí)現(xiàn)迷宮的生成
普里姆算法(Prim算法),圖論中的一種算法,可在加權(quán)連通圖里搜索最小生成樹。本文將利用prim算法迷宮生成及其藝術(shù)渲染,感興趣的可以了解一下2022-10-10
C++版本基于ros將文件夾中的圖像轉(zhuǎn)換為bag包
這篇文章主要介紹了C++版本基于ros將文件夾中的圖像轉(zhuǎn)換為bag包,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01

