Qt 正则表达式

转自Qt正则表达式_qt 正则表达式_骆驼胡杨的博客-CSDN博客

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

正则表达式中字符及字符集

-
正则表达式中的量词

 -

正则表达式中的断言

-
QRegExp同时支持通配符

 -

 自己写了代码验证了下

//    QRegExp regexp("[A-Za-z][1-9][0-9]{0,2}");
//    QRegExp regexp("1*2"); *表示0到多次
//      QRegExp regexp("1?2"); ?表示0到1次
//            QRegExp regexp("1+2"); +表示1到多次
//                QRegExp regexp("\\d+\\D{2}");
//                QRegExp regexp("\d+\D{2}");
                QRegExp regexp("\\b[1-9]{0,1}\\d{0,1}\\\\\\b");
    ui->lineEdit->setValidator(new QRegExpValidator(regexp,this));

发现,在qt使用中,都要使用两个\\才可以,1个的话就是对应的字符,且只有\c\C\d\D\w\W能表示对应的字符(我没有测试所有只测试了部分,感觉就是如果原本转义的是不可见字符则单个\使用的话就不能表示对应的字符例如\a\A都不行),

每次?*+都分不清楚的,可以理解为?表示有或者没有即0到1,+表示正数即1到多,剩下*就表示0到多。

不理解为什么还要有通配符模式,?表示任意一个字符,*表示0到多个字符

-----------

cap()捕获的使用
cap(0)表示完全匹配,会返回整个匹配结果,cap(1) 是第一个捕获括号的文本,cap(2) 是第二个捕获括号的文本

cap(0)cap(1)cap(2) 的区别

使用捕获的格式为:(E)
使用非捕获格式为:(?:E) 非捕获效率比捕获高
    QRegExp exp2("(\\d+)(?:\\s*)(cm|inch(es)?)");//理解是匹配整个模式,又细拆分为几个部分,这个就是找数字+任意个空格+cm或者inch或者inches的字符串,且细分为4个部分,但又不抓取空格,后面的inches又分两次抓取inches,es
    int p2=exp2.indexIn("Length:198inches");
    if(p2>-1)
    {
        qDebug()<<exp2.cap(0);//输出全部匹配的内容 198inches
        qDebug()<<exp2.cap(1);//输出第一个匹配的内容 198
        qDebug()<<exp2.cap(2);//输出第二个匹配的内容 inches

        qDebug()<<exp2.cap(3);//输出第二个匹配的内容 es
    }

-------

//断言 (?!) 表示:不紧跟才能匹配
    QRegExp regAssertFalse("面(?!包)"); //匹配面不能接包,只匹配一个面
    QString str = "面包没了,只剩面条了";
    str.replace(regAssertFalse, "龙虾鲍鱼");
    qDebug() << str;    //输出: "面包没了,只剩龙虾鲍鱼条了"

//断言 (?=) 表示:紧跟才匹配
    QRegExp regAssertTrue("面(?=包)");//匹配面包的面
    QString str1 = "面包没了,只剩面条了";
    str1.replace(regAssertTrue, "草");
    qDebug() << str1;    //输出: "草包没了,只剩面条了"

Qt5引进了新的正则表达式

    QRegularExpression regExp("hello");//构造函数表达式
    qDebug() << regExp.match("hello world"); 
    //输出 QRegularExpressionMatch(Valid, has match: 0:(0, 5, "hello"))
    regExp.setPattern("([A-Z]{3,8})");//在对象上设置表达式,不会覆盖原有的设置
    regExp.setPatternOptions(QRegularExpression::CaseInsensitiveOption);    //大小写不敏感
    qDebug() << regExp.match("hello");//这里进行了两次匹配
    //输出 QRegularExpressionMatch(Valid, has match: 0:(0, 5, "hello"), 1:(0, 5, "hello"))

    //新类捕获匹配
    QRegularExpression regExp1("^(\\d\\d\\d\\d)/(\\d\\d)/(\\d\\d)$");
    QRegularExpressionMatch match0 = regExp1.match("2022/04/04");
    qDebug() << regExp1.match("2022/04/04");

//输出 QRegularExpressionMatch(Valid, has match: 0:(0, 10, "2022/04/04"), 1:(0, 4, "2022"), 2:(5, 7, "04"), 3:(8, 10, "04"))
    if(match0.isValid()){
        QString strMatch0 = match0.captured(0);
        QString year = match0.captured(1);
        QString month = match0.captured(2);
        QString day = match0.captured(3);

        qDebug() << "日期: " << strMatch0;
        qDebug() << "年: " << year;
        qDebug() << "月: " << month;
        qDebug() << "日: " << day;
    }

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

        QString ss("Feb 02 2022");
        QRegularExpressionMatch dateMatch;
        dateMatch = regDate.match(ss, 0,
                                  QRegularExpression::PartialPreferCompleteMatch); //部分匹配
        qDebug() << dateMatch;

//输出 QRegularExpressionMatch(Valid, has match: 0:(0, 11, "Feb 02 2022"), 1:(0, 3, "Feb"))
        bool b_HasMatched = dateMatch.hasMatch();        //完整匹配的返回值
        bool b_Partial = dateMatch.hasPartialMatch();    //部分匹配的返回值

        qDebug() << b_HasMatched; //true
        qDebug() << b_Partial; //false

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值