前言
在工作中,遇到一个应用场景,需要在一个字符串中,提取出符合某些条件的字符串,功能类似于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")
总结
无