1. 程式人生 > >Qt中的正則表示式類QRegExp

Qt中的正則表示式類QRegExp

QRegExp是Qt的正則表示式類.Qt中有兩個不同類的正則表示式.第一類為元字元.它表示一個或多個常量表達式.令一類為轉義字元,它代表一個特殊字元.一.元字元.匹配任意單個字元.例如,1.3可能是1.後面跟任意字元,再...

QRegExp是Qt的正則表示式類.
Qt中有兩個不同類的正則表示式.
第一類為元字元.它表示一個或多個常量表達式.
令一類為 轉義字元,它代表一個特殊字元.

一.元字元
. 匹配任意單個字元.例如, 1.3 可能是1. 後面跟任意字元,再跟3
^ 匹配字串首. 例如, ^12可能是123,但不能是312
$ 配字串尾. 例如, 12$可以是312, 當不能是 123
[] 匹配括號內輸入的任意字元.[123]可以為1, 2 或3
* 匹配任意數量的前導字元. 例如, 1*2可以為任意數量個1(甚至沒有), 後面跟一個2
+ 匹配至少一個前導字元. 例如, 1+2必須為一個或多個1, 後跟一個2
? 匹配一個前導字元或為空. 例如 1?2可以為2或這12

二.統配模式
通過 QRegExp::setPatternSyntax(QRegExp::Wildcard);可以將元字元設定為統配模式.在統配模式下,只有3個元字 符可以使用.他們的功能沒有變化.
? 匹配任意單個字元, 例如, 1?2可以為1,後面跟任意單個字元, 再跟2
* 匹配任意一個字元序列. 例如, 1*2, 可以為1, 後面跟任意數量的字元, 再跟一個2
[] 匹配一個定義的字元集合. 例如, [a-zA-Z.]可以匹配 a到z之間任意一個字元和. [^a]匹配出小寫a以外的字元.

三.轉義序列
. 匹配”.”
^ 匹配”^”
$ 匹配”$”
[ 匹配"["
] 匹配”]”
* 匹配”*”
+ 匹配”+”
? 匹配”?”
匹配響鈴字元,使計算機發出嘟的一聲.
製表符號
換行符號
回車符鉿
s 任意空格
xnn 匹配16進製為nn的字元
nn 匹配8進位制的nn字元
這些表示式均以開始, 與C++的轉義字元相同,所以為了定義QRegExp中的一個轉義序列,
需要在前面新增兩個\

用正則表示式驗證文字有效性

你可以使用QRegExp::exactMatch來判斷一個字串是否符合一個pattern。

{
QString pattern(“.*=.*”);
QRegExp rx(pattern);

void testRegexMatch()

bool match = rx.exactMatch(“a=3″);
qDebug() << match; // True

match = rx.exactMatch(“a/2″);
qDebug() << match; // False
}

用正則表示式提取資料

你可以利用利用正則表示式從一個字串裡提取特定的欄位或資料。例如,你可以用以下程式碼從”a=100″裡提取”a”和”100″。

{
QString pattern(“(.*)=(.*)”);
QRegExp rx(pattern);

void testRegexCapture()

QString str(“a=100″);
int pos = str.indexOf(rx); // 0, position of the first match.
// Returns -1 if str is not found.
// You can also use rx.indexIn(str);
qDebug() << pos;
if ( pos >= 0 )
{
qDebug() << rx.matchedLength(); // 5, length of the last matched string
// or -1 if there was no match
qDebug() << rx.capturedTexts(); // QStringList(“a=100″, ”a”, ”100″),
// 0: text matching pattern
// 1: text captured by the 1st ()
// 2: text captured by the 2nd ()

qDebug() << rx.cap(0); // a=100, text matching pattern
qDebug() << rx.cap(1); // a, text captured by the nth ()
qDebug() << rx.cap(2); // 100,

qDebug() << rx.pos(0); // 0, position of the nth captured text
qDebug() << rx.pos(1); // 0
qDebug() << rx.pos(2); // 2
}
}

用正則表示式修改文字

你可以把字串中匹配的字串替換成”一般字串”

s.replace(QRegExp(“(.*)=”), ”b=”);
qDebug() << s; // b=100

QString s = ”a=100″;

或是把字串中匹配的字串替換”提取的字串”

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--> QString s = ”a=100″;
s.replace(QRegExp(“(.*)=(.*)”), ”\1\2=\2″); // 1 is rx.cap(1), 2 is rx.cap(2)
qDebug() << s; // a100=100

把正則表示式轉換成C/C++ string的小工具

沒有Python的”"”或是C#的@。標準的正則表示式因為出現一些特殊字元,在C/C++程式碼裡使用時,必須進行轉換。例如:”(S+)s*=s*(S*)”必須轉換成”(\S+)\s*=\s*(\S*)”

Qt的SDK裡包含一個很幫的GUI工具,可以方便我們進行這類轉換並測試你的表示式。在Linux下,它的路徑是/usr/local/Trolltech/Qt-4.5.3/examples/tools/regexp/regexp

用正則表示式驗證文字有效性

你可以使用QRegExp::exactMatch來判斷一個字串是否符合一個pattern。

{
QString pattern(“.*=.*”);
QRegExp rx(pattern);

void testRegexMatch()

bool match = rx.exactMatch(“a=3″);
qDebug() << match; // True

match = rx.exactMatch(“a/2″);
qDebug() << match; // False
}

用正則表示式提取資料

你可以利用利用正則表示式從一個字串裡提取特定的欄位或資料。例如,你可以用以下程式碼從”a=100″裡提取”a”和”100″。

{
QString pattern(“(.*)=(.*)”);
QRegExp rx(pattern);

void testRegexCapture()

QString str(“a=100″);
int pos = str.indexOf(rx); // 0, position of the first match.
// Returns -1 if str is not found.
// You can also use rx.indexIn(str);
qDebug() << pos;
if ( pos >= 0 )
{
qDebug() << rx.matchedLength(); // 5, length of the last matched string
// or -1 if there was no match
qDebug() << rx.capturedTexts(); // QStringList(“a=100″, ”a”, ”100″),
// 0: text matching pattern
// 1: text captured by the 1st ()
// 2: text captured by the 2nd ()

qDebug() << rx.cap(0); // a=100, text matching pattern
qDebug() << rx.cap(1); // a, text captured by the nth ()
qDebug() << rx.cap(2); // 100,

qDebug() << rx.pos(0); // 0, position of the nth captured text
qDebug() << rx.pos(1); // 0
qDebug() << rx.pos(2); // 2
}
}

用正則表示式修改文字

你可以把字串中匹配的字串替換成”一般字串”

s.replace(QRegExp(“(.*)=”), ”b=”);
qDebug() << s; // b=100

QString s = ”a=100″;

或是把字串中匹配的字串替換”提取的字串”

s.replace(QRegExp(“(.*)=(.*)”), ”\1\2=\2″); // 1 is rx.cap(1), 2 is rx.cap(2)
qDebug() << s; // a100=100

QString s = ”a=100″;

把正則表示式轉換成C/C++ string的小工具

沒有Python的”"”或是C#的@。標準的正則表示式因為出現一些特殊字元,在C/C++程式碼裡使用時,必須進行轉換。例如:”(S+)s*=s*(S*)”必須轉換成”(\S+)\s*=\s*(\S*)”

Qt的SDK裡包含一個很幫的GUI工具,可以方便我們進行這類轉換並測試你的表示式。在Linux下,它的路徑是/usr/local/Trolltech/Qt-4.5.3/examples/tools/regexp/regexp

轉自:http://blog.const.net.cn/a/8736.htm

---------------------------------------------------------------自學筆記---------------------------------------------------------------

設定IP地址編輯框輸入格式:

QString qStrIPRegExp =
            "((([1-9][0-9]?)|(1[0-9]?[0-9]?)|(2[0-4]?[0-9])|(25?[0-5]))\\.){1}"
            "((0|([1-9][0-9]?)|(1[0-9]?[0-9]?)|(2[0-4]?[0-9])|(25?[0-5]))\\.){2}"
            "(0|([1-9][0-9]?)|(1[0-9]?[0-9]?)|(2[0-4]?[0-9])|(25?[0-5])){1}";
ui->IPAddress->setValidator(new QRegExpValidator(QRegExp(qStrIPRegExp), 0));

IP地址正則表示式優化:

IP: ((25[0-5]|2[0-4]\d|[01]?\d\d?).){3}(25\d|2[0-4]\d|[01]?\d\d?)

Ps:IP地址中每個數字都不能大於255.

01.02.03.04 這樣前面帶有0的數字, 是不是正確的IP地址呢?

答案: 是的, IP 地址裡的數字可以包含有前導 0 (leading zeroes).