Qt——正則表達式(轉)

Qt——正則表達式

 

在項目中經常會遇到對字符串進行操作的情況,我們可以直接使用QString的一些函數,但QT提供了一個更加強大的類——QRegExp,使用正則表達式來操作字符串。

先說說我最近遇到的幾個問題:

1.對輸入框LineEdit中的輸入內容加以限制,比如只能輸入數字,並且最多5位數(因爲int類型不限制位數會導致溢出問題);

2.檢查輸入是否正確,比如判斷是否是1-9999之間的數;

3.獲取一個字符串中的一段內容,比如獲取2015-11-20中的2015。

爲了解決這些問題,下面先看看正則表達式的基本知識。

 

一、基本知識

正則表達式(Regular Expression,通常簡寫爲RegExp、RE等),預先定義一些字符或字符的組合,用於匹配文本中的一段字符串。下面是它的一些用途——

1.驗證

判斷字符串是否符合某個標準,比如“是一個整數”或者“沒有空格”。

2.搜索

正則表達式提供了比普通字符串匹配更爲強大的匹配方式,比如匹配下面的詞語:mail, letter, correspondence,但是不包括email, mailman, letterbox等等。

3.查找並替換

正則表達式能夠用一個不同的字符串,替換所有出現另一個字符串的地方,比如用&替換&,如果原先&後面已經有了amp;那麼不替換。

4.分割字符串

比如,根據tab來分割字符串。

使用正則表達式首先需要了解一些符號的作用,比如\d用來匹配數字,下面結合一些例子說明。

例子 解釋
[abc] 方括號中間是幾個字母,表示a,b,c這三個單獨的字符
[^abc] 除了a,b,c以外的字符
[a-z] 橫槓表示範圍,匹配a到z之間(包括a和z)的所有單個字符
[a-zA-Z] a到z、A到Z的所有單個字符
^ 在一行最前
$ 在一行的最後
\s 匹配任意空白字符
\S 匹配任意非空白的字符
\d 任意數字
\D 任意非數字
\w 任意單字字符(字母、數字或下劃線)
\W 任意非單字字符
(a|b) a或b
a? ?代表0個或1個
a* *代表0個或1個或多個
a+ +代表1個或多個
a{3} 3個a
a{3,} 3個或大於3個a
a{3,6} a的個數在3和6之間(包括3和6)

注意:C++編譯器會對反斜槓進行轉換,要想在正則表達式中包括一個\,需要輸入兩次,例如\\s。要想匹配反斜槓本身,需要輸入4次,比如\\\\。

 

二、在QT中的用法

1.對用戶輸入的限制

void QLineEdit::setValidator(const QValidator * v)

QLineEdit中的這個函數意思是,令LineEidt只接受驗證器 v 所匹配的輸入,你可以對要輸入的內容進行任意的限制。

比如:限制輸入框只能輸入0到99999

QRegExp regExp("0|[1-9]\\d{0,4}");

ui.lineEdit->setValidator(new QRegExpValidator(regExp, this));

2.檢查輸入是否符合格式

QValidator::State QRegExpValidator::validate(QString & input, int & pos) const

如果輸入與正則表達式相匹配,則返回Acceptable;如果部分匹配,則返回Intermediate(部分匹配,意思是如果給它增加額外的字符則能夠匹配正則表達式);如果不匹配則返回Invalid。

enum QValidator::State

這個枚舉類型說明了被驗證的字符串是哪種類型。

QValidator::Invalid:值爲0,表示字符串完全不匹配;

QValidator::Intermediate:值爲1,表示部分匹配;

QValidator::Acceptable:值爲2,表示完全匹配。

// integers 1 to 9999

QRegExp rx("[1-9]\\d{0,3}");

// the validator treats the regexp as "^[1-9]\\d{0,3}$"

QRegExpValidator v(rx, 0);

QString s;

int pos = 0;

  

s = "0";     v.validate(s, pos);    // returns Invalid

s = "12345"; v.validate(s, pos);    // returns Invalid

s = "1";     v.validate(s, pos);    // returns Acceptable

  

rx.setPattern("\\S+");            // one or more non-whitespace characters

v.setRegExp(rx);

s = "myfile.txt";  v.validate(s, pos); // Returns Acceptable

s = "my file.txt"; v.validate(s, pos); // Returns Invalid

  

// A, B or C followed by exactly five digits followed by W, X, Y or Z

rx.setPattern("[A-C]\\d{5}[W-Z]");

v.setRegExp(rx);

s = "a12345Z"; v.validate(s, pos);        // Returns Invalid

s = "A12345Z"; v.validate(s, pos);        // Returns Acceptable

s = "B12";     v.validate(s, pos);        // Returns Intermediate

  

// match most 'readme' files

rx.setPattern("read\\S?me(\.(txt|asc|1st))?");

rx.setCaseSensitive(false);

v.setRegExp(rx);

s = "readme";      v.validate(s, pos); // Returns Acceptable

s = "README.1ST";  v.validate(s, pos); // Returns Acceptable

s = "read me.txt"; v.validate(s, pos); // Returns Invalid

s = "readm";       v.validate(s, pos); // Returns Intermediate

^[0-9]+3c$

看上面的表達式,開頭的^表示必須以[0-9]+開頭,結尾的$表示必須以字母c結尾,如果輸入的是123a,則返回QValidator::Intermediate,表示部分匹配,如果輸入的是233abc,則完全匹配。

3.截取字符串

QString QRegExp::cap(int nth = 0) const

這個函數返回被第n個子表達式捕獲的文本,整個匹配擁有下標0,帶括號的子表達式下標從1開始。

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

int pos = rxlen.indexIn("Length: 189cm");

if (pos > -1) {

    QString value = rxlen.cap(1); // "189"

    QString unit = rxlen.cap(2);  // "cm"

    // ...

}

 

關於正則表達式的知識還有很多,比如結合QString的replace、split等函數使用,更多用法可以參考Qt Assistant。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章