QT的正規表示式

2021-09-10 10:59:38 字數 4135 閱讀 1145

regexps由表示式(expressions)、量詞(quantifiers)和斷言(assertions)組成。

最簡單的乙個表示式就是乙個字元,例如x和5。而一組字元可以使用方括號括起來,例如[abc]將會匹配乙個a或者乙個b或者乙個c,這個也可以簡寫為[a-c],這樣我們要匹配所有的英文大寫字母,就可以使用[a-z]。

乙個量詞指定了必須要匹配的表示式出現的次數。例如,x意味著必須匹配且只能匹配乙個字元x,而x意味著匹配一列字元x,其中至少要包含乙個字元x,但是最多包含5個字元x。

現在假設我們要使用乙個regexp來匹配0到99之間的整數。因為至少要有乙個數字,所以我們使用表示式 [0-9] 開始,它匹配乙個單一的數字一次。要匹配0-99,我們可以想到將表示式最多出現的次數設定為2,即 [0-9] 。

現在這個regexp已經可以滿足我們假設的需要了,不過,它也會匹配出現在字串中間的整數。如果想匹配的整數是整個字串,那麼就需要使用斷言「^」和「$」,

當 ^ 在regexp中作為第乙個字元時,意味著這個regexp必須從字串的開始進行匹配;

當 $ 在regexp中作為最後乙個字元時,意味著regexp必須匹配到字串的結尾。

所以,最終的regexp為 ^[0-9]$ 。 一般可以使用一些特殊的符號來表示一些常見的字元組和量詞。

例如,[0-9] 可以使用 \d 來替代。而對於只出現一次的量詞 ,可以使用表示式本身代替,例如x等價於x 。所以要匹配0-99,就可以寫為 ^\d$ 或者 ^\d\d$ 。而 表示字元是可選的,就是只出現一次或者不出現,它可以使用 ?來代替,這樣regexp就可以寫為 ^\d\d?$ ,它意味著從字串的開始,匹配乙個數字,緊接著是0個或1個數字,再後面就是字串的結尾。

現在我們寫乙個regexp來匹配單詞「mail」或者「letter」其中的乙個,但是不要匹配那些包含這些單詞的單詞,比如「email」和「letterbox」。要匹配「mail」,regexp可以寫成mail ,因為 可以省略,所以又可以簡寫成mail 。下面就可以使用豎線「|」來包含另外乙個單詞,這裡「|」表示「或」的意思。為了避免regexp匹配多餘的單詞,必須讓它從單詞的邊界進行匹配。

首先,將regexp用括號括起來,即 (mail|letter) 。括號將表示式組合在一起,可以在乙個更複雜的regexp中作為乙個元件來使用,這樣也可以方便我們來檢測到底是哪乙個單詞被匹配了。為了強制匹配的開始和結束都在單詞的邊界上,要將regexp包含在 \b 單詞邊界斷言中,即 \b(mail|letter)\b 。這個 \b 斷言在regexp中匹配乙個位置,而不是乙個字元,乙個單詞的邊界是任何的非單詞字元,如乙個空格,新行,或者乙個字串的開始或者結束。

如果想使用乙個單詞,例如「mail」,替換乙個字串中的字元m,但是當字元m的後面是「ail」的話就不再替換。這樣我們可以使用 (?!e) 斷言,例如這裡regexp應該寫成 m(?!mail) 。

如果想統計「eric」和「eirik」在字串**現的次數,可以使用 \b(eric|eirik)\b 或者 \bei?ri[ck]\b 。這裡需要使用單詞邊界斷言『\b』來避免匹配那些包含了這些名字的單詞。

示例:

qregexp rx("^\\d\\d?$");           // 兩個字元都必須為數字,第二個字元可以沒有

qdebug() << rx.indexin("a1"); // 結果為-1,不是數字開頭

qdebug() << rx.indexin("5"); // 結果為0

qdebug() << rx.indexin("5b"); // 結果為-1,第二個字元不是數字

qdebug() << rx.indexin("12"); // 結果為0

qdebug() << rx.indexin(「123」); // 結果為-1,超過了兩個字元

rx.setpattern("\\b(mail|letter)\\b"); // 匹配mail或者letter單詞

qdebug() << rx.indexin("emailletter"); // 結果為-1,mail不是乙個單詞

qdebug() << rx.indexin("my mail"); // 返回3

qdebug() << rx.indexin("my email letter"); // 返回9

rx.setpattern("m(?!ail)"); // 匹配字元m,其後面不能跟有ail字元

qstring str1 = "this is m";

str1.replace(rx,"mail"); // 使用"mail"替換匹配到的字元

qdebug() << "str1: " << str1; // 結果為this is mail

qstring str2 = "my m,your ms,his mail";

str2.replace(rx,"mail");

qdebug() << "str2: " << str2; // 結果為my mail,your mails,his mail

預設的,乙個表示式將自動量化為,就是說它應該出現一次。在下表中列出了量詞的使用情況,其中e代表乙個表示式,乙個表示式可以是乙個字元,或者乙個字符集的縮寫,或者在方括號中的乙個字符集,或者在括號中的乙個表示式。

斷言在regexp中作出一些有關文字的宣告,它們不匹配任何字元。正規表示式中的斷言如下表所示,其中e代表乙個表示式。

qregexp類還支援萬用字元(wildcard)匹配。很多命令shell(例如bash和cmd.exe)都支援檔案萬用字元(file globbing),可以使用萬用字元來識別一組檔案。qregexp的setpatternsyntax()函式就是用來在regexp和萬用字元之間進行切換的。萬用字元匹配要比regexp簡單很多,它只有四個特點,如下表所示。 

在regexp中使用括號可以使一些元素組合在一起,這樣既可以對它們進行量化,也可以捕獲它們。例如,使用表示式 mail|letter 來匹配乙個字串,我們知道了有乙個單詞被匹配了,但是卻不能知道具體是哪乙個,使用括號就可以讓我們捕獲被匹配的那個單詞,比如使用 (mail|letter) 來匹配字串「i sent you some email」,這樣就可以使用cap()或者capturedtexts()函式來提取匹配的字元。

還可以在regexp中使用捕獲到的文字,為了表示捕獲到的文字,使用反向引用 \n ,其中n從1開始編號,比如 \1 就表示前面第乙個捕獲到的文字。例如,使用\b(\w+)\w+\1\b 在乙個字串中查詢重複出現的單詞,這意味著先匹配乙個單詞邊界,隨後是乙個或者多個單詞字元,隨後是乙個或者多個非單詞字元,隨後是與前面第乙個括號中相同的文字,隨後是單詞邊界。

如果使用括號僅僅是為了組合元素而不是為了捕獲文字,那麼可以使用非捕獲語法,例如 (?:green|blue) 。非捕獲括號由「(?:」開始,由「)」結束。使用非捕獲括號比使用捕獲括號更高效,因為regexp引擎只需做較少的工作。

例項:

qregexp rx4("(\\d+)");

qstring str4 = "offsets: 12 14 99 231 7";

qstringlist list;

int pos2 = 0;

while ((pos2 = rx4.indexin(str4, pos2)) != -1)

qdebug() << list; // 結果12,14,99,231,7

qregexp rxlen("(\\d+)(?:\\s*)(cm|inch)");

int pos3 = rxlen.indexin("length: 189cm");

if (pos3 > -1)

Qt 正規表示式

qregexp是qt的正規表示式類.qt中有兩個不同類的正規表示式.第一類為元字元.它表示乙個或多個常量表示式.令一類為 轉義字元,它代表乙個特殊字元.一.元字元 匹配任意單個字元.例如,1.3 可能是1.後面跟任意字元,再跟3 匹配字串首.例如,12可能是123,但不能是312 配字串尾.例如,1...

QT 正規表示式

正規表示式 編寫程式的時候,注意雙層轉義字元解析,有兩次轉義字元解析 see also 上述網頁講述了正規表示式的規則,但實際使用時要注意每個 符號前面要 重複加乙個 見18行 int main int argc,char argv pos will be 9,14,18 and finally 2...

Qt 正規表示式

1.qregexp exp ab ab,abb qregexp exp d 一位數字 qregexp exp x zx z xyz之間的一位 不區分大小寫 qregexp exp 2 6 2 6之間的一位數字 qregexp exp 0 9 0 999 qregexp exp 0 9 0 9 一位整...