Qt正則表達(dá)式使用舉例
正則表達(dá)式
正則表達(dá)式即一個(gè)文本匹配字符串的一種模式,Qt中QRegExp類實(shí)現(xiàn)使用正則表達(dá)式進(jìn)行模式匹配,且完全支持Unicode,主要應(yīng)用:字符串驗(yàn)證、搜索、查找替換、分割。
正則表達(dá)式中字符及字符集

正則表達(dá)式中的量詞

正則表達(dá)式中的斷言

QRegExp同時(shí)支持通配符

新建控制臺(tái)應(yīng)用程序,項(xiàng)目名QRegExp
編輯main.cpp文件//匹配字符 QRegExp ret("a"); qDebug() << "是否匹配成功: " << ret.exactMatch("abc"); //false qDebug() << "是否匹配成功: " << ret.exactMatch("a"); //true //匹配數(shù)字 QRegExp retNum("(\\d*\\D{2})"); qDebug() << "是否匹配成功: " << retNum.exactMatch("120kg"); //true qDebug() << "是否匹配成功: " << retNum.exactMatch("180cm"); //true qDebug() << "是否匹配成功: " << retNum.exactMatch("3M"); //false //匹配通配符 QRegExp re("*.txt") ; re.setPatternSyntax(QRegExp::Wildcard); //支持通配符 qDebug() << "通配符匹配: " << re.exactMatch("a.txt"); //true qDebug() << "通配符匹配: " << re.exactMatch("a.txt.bak"); //false //匹配單詞邊界 QRegExp reg("\\b(hello|Hello)\\b"); qDebug() << "多個(gè)單詞匹配: " << reg.indexIn("helloEveryone"); //-1表示失敗 qDebug() << "多個(gè)單詞匹配: " << reg.indexIn("Hmm Hello Everyone");//4 表示匹配到的字符位置 //匹配捕獲的文本 //以 "(?:" 開(kāi)始, 以 ")" 結(jié)束 QRegExp regHeight("(\\d+)(?:\\s*)(cm|inch)"); int res = regHeight.indexIn("zhangsan 170cm"); if(res > -1){ qDebug() << "regHeight(0):" << regHeight.cap(0); //170cm qDebug() << "regHeight(1):" << regHeight.cap(1); //170 qDebug() << "regHeight(2):" << regHeight.cap(2); //cm } //斷言 (?!) 表示:不緊跟才能匹配 QRegExp regAssertFalse("面(?!包)"); QString str = "面包沒(méi)了,只剩面條了"; str.replace(regAssertFalse, "龍蝦鮑魚(yú)"); qDebug() << str; //輸出: "面包沒(méi)了,只剩龍蝦鮑魚(yú)了" //斷言 (?=) 表示:緊跟才匹配 QRegExp regAssertTrue("面(?=包)"); QString str1 = "面包沒(méi)了,只剩面條了"; str1.replace(regAssertTrue, "草"); qDebug() << str1; //輸出: "龍蝦鮑魚(yú)沒(méi)了,只剩面條了"
qt5新類
//Qt5新類
QRegularExpression regExp("hello");
qDebug() << "QRegularExpression匹配字符: " <<regExp.match("hello world"); //輸出(0, 5, "hello")
regExp.setPattern("([A-Z]{3,8})");
regExp.setPatternOptions(QRegularExpression::CaseInsensitiveOption); //大小寫(xiě)不敏感
qDebug() << "大小寫(xiě)不敏感匹配字符: " <<regExp.match("hello");
//新類捕獲匹配
QRegularExpression regExp1("^(\\d\\d\\d\\d)/(\\d\\d)/(\\d\\d)$");
QRegularExpressionMatch match0 = regExp1.match("2022/04/04");
if(match0.isValid()){
QString strMatch0 = match0.captured(0);
QString year = match0.captured(1);
QString month = match0.captured(2);
QString day = match0.captured(3);
qDebug() << "日期: " << strMatch0;
qDebug() << "年: " << year;
qDebug() << "月: " << month;
qDebug() << "日: " << day;
}
QString sPattern;
sPattern = "^(Jan|Feb|Mar|Apr|May) \\d\\d \\d\\d\\d\\d$";
QRegularExpression regDate(sPattern);
QString ss("Feb 02 2022");
QRegularExpressionMatch dateMatch;
dateMatch = regDate.match(ss, 0,
QRegularExpression::PartialPreferCompleteMatch); //部分匹配
bool b_HasMatched = dateMatch.hasMatch(); //完整匹配的返回值
bool b_Partial = dateMatch.hasPartialMatch(); //部分匹配的返回值
qDebug() << b_HasMatched;
qDebug() << b_Partial;附正則表達(dá)式提取字符串中的數(shù)字方法 :
QString WndName("WndName1");
QRegExp rx("\\d+");
QString wndIndex;
rx.indexIn(WndName,0);
wndIndex=rx.cap(1);
qDebug()<<wndIndex;正則表達(dá)式從一個(gè)字符串里提取特定的字段或數(shù)據(jù) 例如從"a=100"里提取"a"和"100" :
QString pattern("(.*)=(.*)");
QRegExp rx(pattern);
QString str("a=100");
int pos = str.indexOf(rx); // 0, 第一個(gè)的位置
// 如果找不到str,則返回-1
// 你也可以使用rx.indexin(str)
qDebug() << pos;
if ( pos >= 0 )
{
qDebug() << rx.matchedLength(); // 5, 匹配字符串到最后的長(zhǎng)度
// 或者-1如果沒(méi)有匹配
qDebug() << rx.capturedTexts(); // QStringList("a=100", "a", "100"),
// 0: 文本匹配模式
// 1: 第一個(gè)()捕獲的文本
// 2: 第二個(gè)文本的捕獲
qDebug() << rx.cap(0); // a=100, 文本匹配模式
qDebug() << rx.cap(1); // a, 第n個(gè)()捕獲的文本
qDebug() << rx.cap(2); // 100,
qDebug() << rx.pos(0); // 0, 第n個(gè)捕獲文本的位置
qDebug() << rx.pos(1); // 0
qDebug() << rx.pos(2); // 2
}總結(jié)
到此這篇關(guān)于Qt正則表達(dá)式使用的文章就介紹到這了,更多相關(guān)Qt正則表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++二叉樹(shù)實(shí)現(xiàn)詞頻分析功能
這篇文章主要為大家詳細(xì)介紹了C++二叉樹(shù)實(shí)現(xiàn)詞頻分析功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
C語(yǔ)言進(jìn)階教程之字符函數(shù)&字符串函數(shù)
C語(yǔ)言提供了豐富的字符串處理函數(shù),可以對(duì)字符串進(jìn)行輸入、輸出、合并、修改、比較、轉(zhuǎn)換、復(fù)制、搜索等操作,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言進(jìn)階教程之字符函數(shù)&字符串函數(shù)的相關(guān)資料,需要的朋友可以參考下2022-03-03
C++智能指針的補(bǔ)充和特殊類的設(shè)計(jì)示例詳解
智能指針不僅能夠有效避免內(nèi)存泄漏,還能簡(jiǎn)化代碼邏輯,提升程序的健壯性和可維護(hù)性,這篇文章主要介紹了C++智能指針的補(bǔ)充和特殊類設(shè)計(jì)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-11-11
C語(yǔ)言數(shù)據(jù)的存儲(chǔ)超詳細(xì)講解下篇浮點(diǎn)型在內(nèi)存中的存取
使用編程語(yǔ)言進(jìn)行編程時(shí),需要用到各種變量來(lái)存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類型,來(lái)分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么2022-04-04
Qt實(shí)現(xiàn)制作簡(jiǎn)單的計(jì)算器
計(jì)算器是我們生活中很常見(jiàn)的東西,它可以由多種語(yǔ)言多種方式來(lái)實(shí)現(xiàn)。本文主要介紹的是利用Qt實(shí)現(xiàn)的簡(jiǎn)易計(jì)算器的制作,文中的示例代碼講解詳細(xì),需要的可以參考一下2022-12-12
C語(yǔ)言嵌入informix基礎(chǔ)入門示例講解
這篇文章主要介紹了C語(yǔ)言嵌入informix基礎(chǔ)方法,大家參考使用2013-11-11
如何通過(guò)C++求出鏈表中環(huán)的入口結(jié)點(diǎn)
本文主要介紹了通過(guò)C++求解鏈表中環(huán)的入口結(jié)點(diǎn),即給一個(gè)長(zhǎng)度為n鏈表,若其中包含環(huán),請(qǐng)找出該鏈表的環(huán)的入口結(jié)點(diǎn),否則,返回null。需要的朋友可以參考一下2021-12-12

