在許多場景中,我們需要驗證使用者輸入的資料是否有效,或者是查詢並修改文字,或者是提取指定資料,為此,相對於Qstring的一些函數,QT提供了一個更加強大的類——QRegExp,使用函數配合正規表示式來操作字串,QRegExp可以進行下面的操作,並附帶檢驗小程式,可在文末下載。
matchedLength() 匹配的長度
capturedTexts() 捕捉到的字串列表, 對應的還有captureCount() ,獲取表示式中含有的捕捉組的數目
cap(int n) 第n個組的內容(0代表匹配自身)
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);將為空。
將匹配到的字串替換成其他字串,例如將文字中的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個圓括弧中的值。
這裡用到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 |
很多人找不到相對應的檔案,這裡大家可以注意下,例如我是qt5的,那麼只需要doc.qt.io/qt-5/xxxxxxx.html,這裡xxxxxxx只需要寫對應的類名即可找到對應類的檔案,QRegExp類使用正規表示式提供模式匹配。
我的部落格即將同步至騰訊雲+社群,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=1f5f69uzg8o23