Qt——正則表示式
源地址:http://www.cnblogs.com/hellovenus/p/4984751.html
在專案中經常會遇到對字串進行操作的情況,我們可以直接使用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。