Qt Creator编程之正则表达式

匿名 (未验证) 提交于 2019-12-03 00:27:02

正则表达式:在一个文本中匹配子字符串的一种模式,它可以简写为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快速入门》

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!