天天看點

QT正規表達式介紹與使用

作者:Qt技術開發老jie

一、 QT中的QRegExp類實作了正規表達式的模式比對。

二、Qt中有兩個不同類的正規表達式.

- 第一類為元字元.它表示一個或多個常量表達式.

- 另一類為 轉義字元,它代表一個特殊字元.

1) 元字元

. 比對任意單個字元.例如, 2.3 可能是2. 後面跟任意字元,再跟3

^ 比對字元串首. 例如, ^56可能是563,但不能是356

$ 配字元串尾. 例如, 12$可以是356, 當不能是 563

[] 比對括号内輸入的任意字元.[623]可以為6, 2 或3

* 比對任意數量的前導字元. 例如, 1*2可以為任意數量個1(甚至沒有), 後面跟一個2

+ 比對至少一個前導字元. 例如, 1+2必須為一個或多個1, 後跟一個2

? 比對一個前導字元或為空. 例如 1?2可以為2或這12

2)統配模式

通過 QRegExp::setPatternSyntax(QRegExp::Wildcard);可以将元字元設定為統配模式.在統配模式下,隻有3個元字元可以使用.他們的功能沒有變化.

? 比對任意單個字元, 例如, 1?2可以為1,後面跟任意單個字元, 再跟2

* 比對任意一個字元序列. 例如, 1*2, 可以為1, 後面跟任意數量的字元, 再跟一個2

[] 比對一個定義的字元集合. 例如, [a-zA-Z\.]可以比對 a到z之間任意一個字元和. [^a]比對出小寫a以外的字元.

3)轉義序列

\. 比對”.”

\^ 比對”^”

\$ 比對”$”

\[ 比對"["

\] 比對”]”

\* 比對”*”

\+ 比對”+”

\? 比對”?”

\b 比對響鈴字元,使計算機發出嘟的一聲.

\t 制表符号\n 換行符号

\r 回車符鉿

\s 任意空格

\xnn 比對16進制為nn的字元

\0nn 比對8進制的nn字元

這些表達式均以\開始, 與C++的轉義字元相同,是以為了定義QRegExp中的一個轉義序列,需要在前面添加兩個\\

3、QRegExp類的構造函數

- 預設構造函數,QRegExp(),産生一個空的正規表達式對象。

- 拷貝構造函數,QRegExp(const QRegExp& patten)

- 模式構造函數,QRegExp ( const QString & pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive, PatternSyntax syntax = RegExp),産生指定比對模式的正規表達式對象。

4、可以獲得正規表達式對象的資訊和比對資訊

1) isValid(),判斷正規表達式是否合法,合法傳回true,否則傳回false。

例如:QRegExp exp1("c[9]");

bool valid=exp1.isValid();//傳回true

QRegExp exp1("c[9");

bool valid=exp1.isValid();//傳回false

2)errorString()

檢查正則是否有錯誤,和isValid類似,當有錯誤時傳回"no error occurred", 無錯誤傳回"unexpected end"

3)isEmpty(),判斷正則是否為空,當采用預設構造函數生成正則時,此函數傳回true,否則傳回false。

e.g. QRegExp exp1;

bool valid=exp1.isEmpty();//傳回true

4) caseSensitivity () 看正則是否大小寫敏感。

5) cap(),capturedTexts () 前者獲得捕捉的每一項,index從1開始,後者則獲得整個捕捉清單。

6) exactMatch(QString),傳回是否整串比對,比對一部分也傳回false。

7) indexIn(),進行比對,如果成功則傳回index,不成功傳回-1

8) matchedLength(),傳回比對的串的長度。

9) numCaptures(),獲得正則裡捕捉項的個數。

10) pattern(),獲得正則本身

11) patternSyntax()

enum PatternSyntax { RegExp, RegExp2, Wildcard, FixedString } 預設為RegExp。

5、舉例

QRegExp rx;

rx.setPatternSyntax(QRegExp::RegExp);

rx.setCaseSensitivity(Qt::CaseSensitive); //大小寫敏感

rx.setPattern(QString("^[A-Za-z0-9]+#34;)); //比對所有大小寫字母和數字組成的字元串

QString s = "dsada@";

rx.exactMatch(s); //傳回的值為false,因為s中含有@字元

------------------------------------------------------------------------------------

1、常用正規表達式

字元 說明

\r, \n 代表 回車和換行符

\t 制表符

\\ 代表 "\" 本身

\^ 比對 ^ 符号本身

\$ 比對 $ 符号本身

. 比對除了換行符以外的任意字元

\w 比對字母、數字、下劃線、漢字

\s 比對任意的空白符

\b 單詞的開始或結尾

\~ 比對字元串的開始

$ 比對字元串的結束

\ba\w*\b :比對以字母a開頭的單詞——先是某個單詞開始處(\b),然後是字母a,然後是任意數量的字母或數字(\w*),最後是單詞結束處(\b)。

\d+ :比對1個或更多連續的數字。這裡的+是和*類似的元字元,不同的是*比對重複任意次(可能是0次),而+則比對重複1次或更多次。

\b\w{6}\b: 比對剛好6個字元的單詞。

[] 包含一系列字元

[^] 包含之外一系列字元

[ab5@]: 比對 "a" 或 "b" 或 "5" 或 "@"

[^abc]: 包含abc之外的任意字元

[f-k]: f-k之間的任意字元

表達式 說明

{n} 表達式重複n次,比如:"\w{2}" 相當于 "\w\w";"a{5}" 相當于 "aaaaa"

{m,n} 表達式至少重複m次,最多重複n次,比如:"ba{1,3}"可以比對 "ba"或"baa"或"baaa

{m,} 表達式至少重複m次,比如:"\w\d{2,}"可以比對 "a12","_456","M12344".

? 比對表達式0次或者1次,相當于 {0,1},比如:"a[cd]?"可以比對 "a","ac","ad"

+ + 表達式至少出現1次,相當于 {1,},比如:"a+b"可以比對 "ab","aab","aaab".

* 表達式不出現或出現任意次,相當于 {0,},比如:"\^*b"可以比對 "b","^^^b".

比如:"\w{2}" 相當于 "\w\w";"a{5}" 相當于 "aaaaa"

比如:"ba{1,3}"可以比對 "ba"或"baa"或"baaa"

比如:"\w\d{2,}"可以比對 "a12","_456","M12344"...

如:"a[cd]?"可以比對 "a","ac","ad"

如:"a+b"可以比對 "ab","aab","aaab"

如:"\^*b"可以比對 "b","^^^b"

舉例1:表達式 "\d+\.?\d*" 在比對 "It costs $12.5" 時,比對的結果是:成功;比對到的内容是:"12.5";比對到的位置是:開始于10,結束于14。

舉例2:表達式 "go{2,8}gle" 在比對 "Ads by goooooogle" 時,比對的結果是:成功;比對到的内容是:"goooooogle";比對到的位置是:開始于7,結束于17。

---------------------------txwtech---------------------------------------------------------

[ab5@] 比對 "a" 或 "b" 或 "5" 或 "@"

[f-k] 比對 "f"~"k" 之間的任意一個字母

[^abc] 比對 "a","b","c" 之外的任意一個字元

[^A-F0-3] 比對 "A"~"F","0"~"3" 之外的任意一個字元

舉例1:表達式 "[tcd][tcd]" 比對 "atc123" 時,比對的結果是:成功;比對到的内容是:"tc";比對到的位置是:開始于1,結束于3。

舉例2:表達式 "[^atc]" 比對 "atc123" 時,比對的結果是:成功;比對到的内容是:"1";比對到的位置是:開始于3,結束于4。

繼續閱讀