Qt 正则表达式findAll函数的实现


前言

在工作中,遇到一个应用场景,需要在一个字符串中,提取出符合某些条件的字符串,功能类似于python中的re.findall函数功能.


提示:Qt5的正则表达式貌似不支持正则中的问号"?",只能通过调用函数QRegExp::setMinimal(bool) 设置贪婪和非贪婪,这一点非常坑,这会导致在一些工具网站上测试通过的正则表达式,但是在qt上是不能使用的,需要尤为注意

一、在python中的写法

在python 中是使用(.*?) 中的问号,进行正则匹配中贪婪模式/非贪婪模式的区分,因此在python中这样编写:

import re
 
line = "\\u001B[01;31m250EthernetTRDPTest-2CCU.tar.gz     \\u001B[01;31m250EthernetTRDPTest-2CCU.tar.gz    \\u001B[01;31m250EthernetTRDPTest_CCU.tar.gz "
# .* 表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符
# (.*?) 表示"非贪婪"模式,只保存第一个匹配到的子串
tempList = re.findall( r"u001B\[[0-9]+;[0-9]+m(.*?)[ ]+", line)
print(tempList)
#['250EthernetTRDPTest-2CCU.tar.gz', '250EthernetTRDPTest-2CCU.tar.gz', '250EthernetTRDPTest_CCU.tar.gz']

二、在Qt5中的写法

1.引入库

代码如下(示例):

#include <QRegExp>
#include <Debug>
#include <QList>
#include <QString>

2.编写类似re.findall的函数

代码如下:

QList<QString> findAll(QString pattern,QString str,bool noGreedy){
//    QRegExp rxlen("u001B\[[0-9]+;[0-9]+m(.*)[ ]+");//构造 QRegExp 对象
    QRegExp rxlen(pattern);//构造 QRegExp 对象
    rxlen.setMinimal(noGreedy); //非贪婪模式匹配,True:非贪婪,False:贪婪
    int position = 0;  //匹配的位置
    QList<QString> strList;
    while (position >= 0) {
        position = rxlen.indexIn(str,position); // 从str中匹配对应的字符串,从position 这个位置开始匹配
        if(position < 0) // 未成功匹配,直接退出
            break;
        strList << rxlen.cap(1);//得到匹配的字符串,,cap(index),index = 0是整个字符串;当 index >= 1 得到的是 QRegExp 中小括号中匹配的字符串
        position += rxlen.matchedLength(); // 刷新匹配的位置
    }
    return strList;
}

函数调用如下


QString pattern = "u001B\[[0-9]+;[0-9]+m(.*)[ ]+";
QString str = "\\u001B[01;31m250EthernetTRDPTest-2CCU.tar.gz     \\u001B[01;31m250EthernetTRDPTest-2CCU.tar.gz    \\u001B[01;31m250EthernetTRDPTest_CCU.tar.gz "
qDebug()<<findAll(pattern ,str ,true);
//("250EthernetTRDPTest-2CCU.tar.gz", "250EthernetTRDPTest-2CCU.tar.gz", "250EthernetTRDPTest_CCU.tar.gz")

总结

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值