
在許多場景中,我們需要驗證用戶輸入的資料是否有效,或者是查找并修改文本,或者是提取指定資料,為此,相對于Qstring的一些函式,QT提供了一個更加強大的類——QRegExp,使用函式配合正則運算式來操作字串,QRegExp可以進行下面的操作,并附帶檢驗小程式,可在文末下載,
一.正則運算式相關函式用法
1.提取資料
matchedLength() 匹配的長度
capturedTexts() 捕捉到的字串串列, 對應的還有captureCount() ,獲取運算式中含有的捕捉組的數目
cap(int n) 第n個組的內容(0代表匹配自身)
- cap()引數預設值為0,
- cap(0):表示匹配的整個文本的值,
- cap(1):表示第1個圓括弧中的值,
- cap(2):表示第2個圓括弧中的值,
pos(int n) 第n個組的位置(默認值為0)
QRegExp::indexIn() 搜索字串以找到匹配的字串,回傳索引值,失敗回傳-1
QRegExp::lastIndexIn() 同上,只是從后向前搜索
QString str = "(.*)=(.*)";
QRegExp rx_1(str);
QString str_1 = ("a=100");
int pos = rx_1.indexIn(str_1);
if(pos>=0)
{
qDebug()<<rx_1.matchedLength(); //5
qDebug()<<rx_1.capturedTexts(); //("a=100", "a", "100")
qDebug()<<rx_1.cap(0);//"a=100"
qDebug()<<rx_1.cap(1);//"a"
qDebug()<<rx_1.cap(2);//"100"
qDebug()<<rx_1.pos(0);//0
qDebug()<<rx_1.pos(1);//0
qDebug()<<rx_1.pos(2);//2
}
(?:pattern)是非捕獲型括號 匹配pattern,但不捕獲匹配結果
(pattern)是捕獲型括號, 匹配pattern,匹配pattern并捕獲結果,自動獲取組號
(?<name> pattern ) 匹配pattern, 匹配pattern并捕獲結果,設定name為組名
例如,將(.*)=(.*)改為(?:.*)=(.*),qDebug()<<rx_1.cap(1);該值將為100,而 qDebug()<<rx_1.cap(2);將為空,
2.修改文本
將匹配到的字串替換成其他字串,例如將文本中的a=100修改為b=100
QString str = "a=100";
s.replace(QRegExp("(.*)="),"b=");
將匹配到的字串內容進行自定義或替換,例如將文本中的a=100修改為100=a
Qstring str = "a=100";
s.replace(QRegExp("(.*)=(.*)"),"\\2=\\1");// \\1就是相當于cap(1),表示第1個圓括弧中的值,
3.驗證文本有效性
這里用到QRegExp::exactMatch來判斷輸入的字符是否符合正則運算式,
QRegExp::exactMatch() 判斷字串是否完全(從頭到尾)匹配,回傳真或假
QRegExp rx("\\d"); //正則運算式
bool match = rx.exactMatch("8");//驗證文本
if(match == true)
{
//運算式正確
return;
}
//運算式錯誤
對此,QRegExp都有相對應的函式方法,還有一些函式上面沒有寫出來,例如:
isValid();//判斷正則運算式是否合法,合法回傳true,否則回傳false,
pattern();//獲得正則本身
其他完整函式,大家可在文末點擊官方檔案查閱,當然,所有的函式方法都離不開一個核心就是正則運算式,我們來看下,
二.正則運算式
正則運算式是由運算式+量詞+斷言組成,
首先是運算式:
| 例子 | 含義 |
|---|---|
| c | 除非具有特殊的正則運算式含義(., ^, $, [, ], * , +, ? ),否則字符表示自身,例如c匹配字符c |
| \c | 除以下指定的字符外,反斜杠后面的字符與字符本身匹配,例如,要匹配字串開頭的文字插入符,請寫\ ^ |
| \a | 匹配ASCII鈴聲(BEL,0x07) |
| \f | 匹配ASCII換頁(FF,0x0C) |
| \n | 匹配ASCII換行符(LF,0x0A,Unix換行符) |
| \r | 匹配ASCII回車(CR,0x0D) |
| \t | 與ASCII水平制表符(HT,0x09)匹配 |
| \v | 匹配ASCII垂直制表符(VT,0x0B), |
| .(dot) | 匹配任何字符(包括換行符) |
| \d | 匹配一個數字 |
| \D | 匹配一個非數字, |
| \s | 匹配一個空白字符 |
| \S | 匹配非空格字符, |
| \w | 任意單字字符(字母,數字或者下劃線) |
| \W | 任意非單字字符 |
| \n | 第n個反向參考,例如\ 1,\ 2等, |
注意: C ++編譯器將反斜杠轉換為字串,要將\包含在正則運算式中,請輸入兩次,即\\,要匹配反斜杠字符本身,請輸入四次,即\\\\,
最簡單的一個正則運算式就是字符,例如:
- a 匹配字符a
- b 匹配字符b
- 9 匹配數字9
運算式后面可以加量詞,默認情況下,運算式會自動由{1,1}進行量化,即它應該只出現一次,在下面的串列中,E代表表達,運算式是一個字符,或者是一組字符的縮寫,或者在方括號中是一組字符,或者在括號中是運算式,
| 例子 | 解釋 |
|---|---|
| E? | ?代表0個或1個 |
| E* | *代表0個或1個或多個 |
| E+ | +代表1個或多個 |
| E{3} | 匹配3次 |
| E{3,} | 匹配大于等于3次 |
| E{,6} | 匹配至多m次,等價于a{0,m} |
| E{3,6} | 匹配至少3次,至多6次(包括3和6) |
例如:
- E?匹配0次或者1次E
- E+ 匹配1次或者多次E
- E{3,6} 匹配至少3次,至多6次E
可以在運算式和量詞的基礎,加入斷言,進行一些限制,例如我們想要匹配0-9,我們可以將正則運算式寫為/d,如果我們想要匹配0-99,我們可以寫成[0-9]{1,2},這時,字串“89”符合,字串“我們今年21歲了”也符合,因為里面有21,單獨使用[0-9]{1,2},它會匹配包括出現在字串中間的整數,如果想匹配的整數是整個字串,那么就需要使用斷言“^”和“$”了,
斷言在正則運算式中出現的位置對文本進行一些宣告,但不匹配任何字符,在以下串列中,E代表任何運算式,
| 例子 | 解釋 |
|---|---|
| ^ | 尖號表示字串的開頭,如果您想匹配文字,則必須通過書寫將其轉義\,例如,^#include將僅匹配以字符’#include’開頭的字串,(當插入號是字符集的第一個字符時,它具有特殊含義,請參見字符集,) |
| $ | 美元表示字串的結尾,例如,\ d \ s * 將 匹 配 以 數 字 結 尾 ( 可 選 ) 后 跟 空 格 的 字 符 串 , 如 果 您 想 匹 配 文 字 將匹配以數字結尾(可選)后跟空格的字串,如果您想匹配文字 將匹配以數字結尾(可選)后跟空格的字符串,如果您想匹配文字,則必須通過書寫將其轉義\$, |
| \b | 單詞邊界,例如,正則運算式\ bOK \ b表示在單詞邊界(例如字串或空白的開頭)之后立即匹配字母“ O”,然后緊接在另一個單詞邊界(例如字串或空白的結尾)之前匹配字母“ K”,但是請注意,該斷言實際上并不與任何空格匹配,因此如果我們撰寫(\ bOK \ b)并且具有匹配項,即使該字串為“ It’s OK now”,它也將僅包含“ OK ”, |
| \B | 非單詞邊界,只要\ b為假,該斷言就為真,例如,如果我們在“ Left on”中搜索\ Bon \ B,則匹配將失敗(字串的空格和結尾不是非單詞邊界),但將在“ t on ne”中匹配, |
| (?= E) | 如果運算式此時在regexp中匹配,則此斷言為true, |
| (?!E) | 如果此運算式在regexp中不匹配,則此斷言為true, |
除此之外,還有其他一些其他字符可以和運算式組合,方括號表示匹配方括號中包含的任何字符,上述字符集縮寫可以出現在方括號中的字符集中,除字符集縮寫和以下兩個例外外,字符在方括號中沒有特殊含義,
| 例子 | 含義 |
|---|---|
| ^ | 如果字符集作為第一個字符出現(即緊接在方括號之后),則插入符將否定該字符集,[ABC]匹配’a’或’b’或’c’的,但[^ ABC]匹配任何但’a’或’b’或’c’的, |
| - | 破折號表示字符范圍,[W-Z]與“ W”或“ X”或“ Y”或“ Z”匹配, |
通配符匹配,大多數命令外殼(如bash或cmd.exe)都支持“檔案通配”,即使用通配符標識一組檔案的能力,所述setPatternSyntax()函式用于正則運算式和通配符模式之間切換,通配符匹配比完整的正則運算式簡單得多,并且只有四個功能:
| 例子 | 解釋 |
|---|---|
| c | 除了下面提到的那些字符以外,任何字符都代表自己,因此,c與字符c相匹配, |
| ? | 匹配任何單個字符,與相同,在完整的正則運算式中, |
| * | 匹配零個或多個任何字符,與完整正則運算式中的,*相同, |
| […] | 字符集可以用方括號表示,類似于完整的正則運算式,在字符類中,與外部一樣,反斜杠沒有特殊含義, |
其他一些組合
| 例子 | 解釋 |
|---|---|
| [abc] | 方括號中間是幾個字母,表示a,b,c這三個單獨的字符 |
| ^abc | 除了a,b,c以外的字符 |
| [a-z] | 匹配a到z之間(包括a和z)的所有單個字符 |
| [a-zA-Z] | a到z,A到Z的所有單個字符 |
| (a|b) | a或b |
三.鏈接及下載
- github檢驗小程式原始碼
- codechina檢驗小程式原始碼
- 檢驗小程式下載(關注免費下載)
- qt正則運算式官方檔案
很多人找不到相對應的檔案,這里大家可以注意下,例如我是qt5的,那么只需要doc.qt.io/qt-5/xxxxxxx.html,這里xxxxxxx只需要寫對應的類名即可找到對應類的檔案,QRegExp類使用正則運算式提供模式匹配,
我的博客即將同步至騰訊云+社區,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=1f5f69uzg8o23
CSDN認證博客專家
Qt
C
C++
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/185957.html
標籤:其他
