Qt正規表示式類QRegExp(附檢驗小程式)

2020-10-22 12:00:46

在這裡插入圖片描述


       在許多場景中,我們需要驗證使用者輸入的資料是否有效,或者是查詢並修改文字,或者是提取指定資料,為此,相對於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

三.連結及下載

很多人找不到相對應的檔案,這裡大家可以注意下,例如我是qt5的,那麼只需要doc.qt.io/qt-5/xxxxxxx.html,這裡xxxxxxx只需要寫對應的類名即可找到對應類的檔案,QRegExp類使用正規表示式提供模式匹配。


我的部落格即將同步至騰訊雲+社群,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=1f5f69uzg8o23

花狗Fdog_ CSDN認證部落格專家 Qt C C++
敲程式碼就是這樣,隨著時間的推移,來來回回不斷重複。
對待問題的看法,邏輯的推理,思維的跳躍。
從不會到實現,再到不滿足再實現。
可執行檔案不是你的財富,修改過程中的經驗才是。
我是花狗Fdog,自學C/C艹/QT。
一年成為部落格專家,一個有想法的大專生。