- 前言
- 一、在python中的写法
- 二、在Qt5中的写法
- 1.引入库
- 2.编写类似re.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.引入库
代码如下(示例):
#include2.编写类似re.findall的函数#include #include #include
代码如下:
QListfindAll(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 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()<总结 无



