正则表达式

本文介绍了Qt中的QRegExp类如何使用正则表达式进行模式匹配,包括字符集、量词和断言的用法,并通过实例展示了通配符的匹配。还探讨了QRegularExpression类在匹配、捕获文本和断言等方面的使用,以及在实际场景中的应用。
摘要由CSDN通过智能技术生成

正则表达式

正则表达式即一个文本匹配字符串的一种模式,Qt中QRegExp类实现使用正则表达式进行模式匹配,且完全支持Unicode,主要应用:字符串验证、搜索、查找替换、分割。
正则表达式中字符及字符集

元素含义
c匹配字符本身,如a匹配a
\c跟在\后面的字符匹配字符本身,但本表中下面指定的这些字符除外。
\a匹配ASCII的振铃
\f匹配ASCII的换页
\n匹配ASCII的换行
\r匹配ASCII的回车
\t匹配ASCII的水平制表符
\v匹配ASCII的垂直制表符
\xhhhh匹配Unicode字符对应的十六进制数
\0ooo匹配八进制的ASCII/Latin1字符
.匹配任意字符
\d匹配任意一个数字
\D匹配一个非数字
\s匹配一个空白字符,包括“\t”、“\n”、“\v”、“\f”、“\r”及“”
\S匹配一个非空白字符
\w匹配一个单词字符,包括任意字符数字下划线,即AZ,az,0~9中任意一个
\W匹配一个非单词字符
\n第n个反向引用

正则表达式中的量词

量词含义
E?匹配0次或1次等价于E{0,1}
E+匹配1次或多次,等价于E{1,}
E*匹配0次或多次,等价于E{0,}
E{n}匹配n次
E{n,}匹配至少n次
E{,m}匹配至多m次
E{n,m}匹配至少n次,至多m次

正则表达式中的断言

断言含义
^标志字符串的开始。若匹配“”则使用“\
$标志字符串的结尾。若匹配“$”则使用“\$”
\b一个单词的边界
\B一个非单词的边界。当\b为false则它为true
(?=E)表达式后紧跟E才匹配
(?!E)表达式后不跟E才匹配

QRegExp同时支持通配符

通配符含义
c任意一个字符,表字符本身
任意一个字符,类似regexp中“.”
*任意0个或多个字符
[…]在[]中的字符集

demo

#include <QCoreApplication>
#include <QDebug>
#include <QRegularExpression>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QRegExp reg("ab");
    qDebug() << "匹配字符本身:"
             << reg.exactMatch("abc")
             << reg.exactMatch("ab")
             << endl;

    QRegExp reg0("(\\d*\\D{2})");
    qDebug() << "匹配数字:"
             << reg0.exactMatch("183cm")
             << reg0.exactMatch("183m")
             << reg0.exactMatch("72in");

    QRegExp rx("*.txt");
    //设置匹配语法
    rx.setPatternSyntax(QRegExp::Wildcard);//支持通配符
    qDebug() << "通配符匹配:"
             << rx.exactMatch("License.txt")
             << rx.exactMatch("License.txt.bak")
             << endl;

    //匹配单词边界
    QRegExp reg1;
    //设置匹配模式
    reg1.setPattern("\\b(hello|Hello)\\b");
    qDebug() << "匹配多个单词:"
             << reg1.indexIn("helloEveryone!")      //-1表失败
             << reg1.indexIn("Hmm hello everyone!") //4,匹配到的字符位置
             << reg1.indexIn("Hi girls! Hello boys!")//10
             << endl;

    //捕获匹配的文本
    //非捕获括号语法:由 “(?:” 开始,“)”结束
    QRegExp regHeight("(\\d+)(?:\\s*)(cm|inch)");
    int res = regHeight.indexIn("YaoMing 226 cm");
    if(res > -1){
        qDebug() << "文本捕获:"
                 << "cap(0):" << regHeight.cap(0)
                 << "cap(1):" << regHeight.cap(1)
                 << "cap(2):" << regHeight.cap(2)
                 << endl;
    }

    //断言?! 不紧跟才匹配
    QRegExp reg2;
    reg2.setPattern("面(?!包)");
    QString str = "面没了,吃面包也好,吃面食物也可以。";
    qDebug() << str << endl;
    str.replace(reg2,"意大利");
    qDebug() << str << endl;

    //Qt5引入了新的类
    QRegularExpression regExp("hello");
    qDebug() << "QRegularExpression 匹配字符:"
             << regExp.match("hello world!");

    regExp.setPattern("[A-Z]{3,8}");
    regExp.setPatternOptions(QRegularExpression::CaseInsensitiveOption);
    qDebug() << "大小写不敏感匹配:"
             << regExp.match("hello");

    QRegularExpression reDate("^(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)$");
    QRegularExpressionMatch match0 = reDate.match("01/10/1949");
    if( match0.hasMatch() ){
        QString strMatch = match0.captured(0);
        QString day = match0.captured(1);
        QString month = match0.captured(2);
        QString year = match0.captured(3);

        qDebug() << "捕获文本:"
                 << "strMatch:" << strMatch << endl
                 << "day:" << day << endl
                 << "month:" << month << endl
                 << "year:" << year;
    }

    QString sPattern;
    sPattern = "^(Jan|Feb|Mar|Apr|May) \\d\\d \\d\\d\\d\\d$";
    QRegularExpression reDate1(sPattern);

    QString ss("Apr 01");
    QRegularExpressionMatch match2;
    match2 = reDate1.match(ss,
                           0,
                           //部分匹配
                           QRegularExpression::PartialPreferCompleteMatch
                           );
    bool bHasMatched = match2.hasMatch();
    bool bPartial = match2.hasPartialMatch();
    qDebug() << bHasMatched << bPartial;

    return a.exec();
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Respect@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值