Qt Creator程式設計之正規表示式
正規表示式:在一個文字中匹配子字串的一種模式,它可以簡寫為regexp。
一個regexp可以主要應用在以下幾個方面:
1.驗證。regexp可以測試一個子字串是否符合一些規範。例如,是否是一個整數或者不包含任何空格等。
2.搜尋。regexp提供了比簡單的子字串匹配更強大的模式匹配。例如,匹配單詞mail或者letter,而不匹配單詞email、mailman或者letterbox。
3.查詢和替換。regexp可以使用一個不同的字串替換所有匹配的子字串。例如,使用Mail來替換一個字串中所有的M字元,但是M字元後面有ail時則不進行替換。
4.字串分割。regexp可以識別在哪裡使用正規表示式進行模式匹配。例如,分割製表符隔離的字串。
Regexps由表示式、量詞和斷言組成。
表示式:一個字元,例如x和5;一組字元,例如[abc](可以簡寫為a-c)。
量詞:指定了必須要匹配的表示式出現的次數。例如x{1,1}意味著必須匹配且只能匹配一個字元x。
可以使用一些特殊的符號來表示一些常見的字元組和量詞。例如,[0-9]可以用"\d"來替代。要匹配0~99,就可以寫為"^\d{1,2}$"或者"^\d\d{0,1}$"。而{0,1}表示字元是可選的,就是隻出現一次或者不出現,它可以使用"?"來代替,這樣regexp就可以寫為"^\d\d? $",它意味著從字串的開始,匹配一個數字,緊接著是0個或一個數字,再後面就是字串的結尾。
如果想使用一個單詞,如Mail,替換一個字串中的字元M,但是當字元M的後面是ail的話就不再替換。這樣可以使用(?!E)斷言,例如這裡regexp應該寫成M(?!Mail)。
下面在實際程式中對這些例子進行演示。
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
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,超過了兩個字元
qDebug() << "*******************"; // 輸出分割符,為了顯示清晰
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
qDebug() << "*******************";
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
qDebug() << "*******************";
QString str3 = "One Eric another Eirik, and an Ericsson. "
"How many Eiriks, Eric?"; // 一個字串如果一行寫不完,換行後兩行都需要加雙引號
QRegExp rx2("\\bEi?ri[ck]\\b"); // 匹配Eric或者Eirik
int pos = 0;
int count = 0;
while (pos >= 0) {
pos = rx2.indexIn(str3, pos);
if (pos >= 0) {
++pos; // 從匹配的字元的下一個字元開始匹配
++count; // 匹配到的數目加1
}
}
qDebug() << "count: " << count; // 結果為3
QRegExp rx3("*.txt");
rx3.setPatternSyntax(QRegExp::Wildcard);
qDebug() << rx3.exactMatch("README.txt"); // 結果為true
qDebug() << rx3.exactMatch("welcome.txt.bak"); // 結果為false
QRegExp rx4("(\\d+)");
QString str4 = "Offsets: 12 14 99 231 7";
QStringList list;
int pos2 = 0;
while ((pos2 = rx4.indexIn(str4, pos2)) != -1) {
list << rx4.cap(1); // 第一個捕獲到的文字
pos2 += rx4.matchedLength(); // 上一個匹配的字串的長度
}
qDebug() << list; // 結果12,14,99,231,7
QRegExp rxlen("(\\d+)(?:\\s*)(cm|inch)");
int pos3 = rxlen.indexIn("Length: 189cm");
if (pos3 > -1) {
QString value = rxlen.cap(1); // 結果為189
QString unit = rxlen.cap(2); // 結果為cm
QString string = rxlen.cap(0); // 結果為189cm
qDebug() << value << unit << string;
}
QRegExp rx5("\\b(\\w+)\\W+\\1\\b");
rx5.setCaseSensitivity(Qt::CaseInsensitive); // 設定不區分大小寫
qDebug() << rx5.indexIn("Hello--hello"); // 結果為0
qDebug() << rx5.cap(1); // 結果為Hello
QRegExp rx6("\\b你好\\b"); // 匹配中文
qDebug() << rx6.indexIn("你好"); // 結果為0
qDebug() << rx6.cap(0); // 整個字串完全匹配,使用cap(0)捕獲,結果為“你好”
}
Widget::~Widget()
{
delete ui;
}
這裡使用了QRegexp的indexIn()函式,它從指定的位置開始向後對字串進行匹配,預設是從字串開始進行匹配。如果匹配成功,則返回第一個匹配到的位置的索引;如果沒有匹配到,則返回-1.setPattern()函式用來輸入一個regexp。而QString的replace()函式可以使用給定的regexp和替換字元來進行字串的替換。
出處:《Qt Creator快速入門》
相關文章
- 05 shell程式設計之正規表示式程式設計
- shell程式設計(四)| grep正規表示式程式設計
- shell程式設計(四)| sed 正規表示式程式設計
- 學習C#高階程式設計之正規表示式C#程式設計
- python之正規表示式Python
- 理解正規表示式(程式設計師第3期文章)程式設計師
- 【Perl程式設計-6】正規表示式--替換+轉化程式設計
- java正規表示式之 groupJava
- 正規表示式之難點
- 轉|正規表示式之匹配中文
- 前端基礎之正規表示式前端
- Python 之 RE(正規表示式)常用Python
- Python基礎之正規表示式Python
- Go 正規表示式庫之 commonregexGo
- 正規表示式
- 正規表示式.
- 正規表示式(程式碼java版)Java
- 匹配空行正規表示式程式碼
- php之正規表示式函式總結PHP函式
- 好程式設計師大資料教程分享Scala系列之檔案以及正規表示式程式設計師大資料
- 【正規表示式】常用的正規表示式(數字,漢字,字串,金額等的正規表示式)字串
- 正規表示式之(exp),(?:exp),(?=exp) 理解
- Python筆記五之正規表示式Python筆記
- 《JavaScript 闖關記》之正規表示式JavaScript
- 開心檔之MySQL 正規表示式MySql
- Linux之grep中的正規表示式Linux
- php –正規表示式PHP
- 【Linux】正規表示式Linux
- 【JavaScript】正規表示式JavaScript
- URL正規表示式
- 正規表示式 split()
- 初探正規表示式
- 正規表示式 test()
- 正規表示式(?!)作用
- 正規表示式 {n,}
- SQL正規表示式SQL
- 正規表示式(java)Java
- Python——正規表示式Python