700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 使用Qt正则表达式提取全路径的文件名

使用Qt正则表达式提取全路径的文件名

时间:2021-09-11 16:50:18

相关推荐

使用Qt正则表达式提取全路径的文件名

问题描述:

给定三个全路径,例如

path1="C:/Users/asus/Desktop/nefertiti_4465.obj";

path2="C:/Users/asus/Desktop/nefertiti_4465_k1.txt";

path3="C:/Users/asus/Desktop/nefertiti_4465_k2.txt";

我希望说明path2和path3的文件和path1的文件是一类文件。

解决方案:

1.提取全路径的文件名,并构造新的正则表达式

QRegExp rx1("([^/]+)\\..+"); QString filename="C:/Users/asus/Desktop/nefertiti_4465.obj";//filename包含全路径,int pos=rx1.indexIn(fileName); assert(pos!=-1);QString simple_filename=rx1.cap(1)+"_k[1-2]"; //simple_filename不包含路径,nefertiti_4465_k1或者nefertiti_4465_k2QString pattern=(simple_filename)+"\\..+"; //构造新的正则表达式,例如:匹配nefertiti_4465_k1.txt或者nefertiti_4465_k2.txtQRegExp rx2(pattern);

注意:

上面语句中含有提取文件名的方法,即

QRegExp rx1("([^/]+)\\..+"); //定义正则表达式int pos=rx1.indexIn(fileName); //fileName即"C:/Users/asus/Desktop/nefertiti_4465.obj"if(pos==-1){......//匹配失败}int pos=rx1.indexIn(fileName); //匹配好的起始位置QString file=rx1.cap(0); //nefertiti_4465.objQString file2=rx1.cap(1); //nefertiti_4465 ,即正则表达式()中捕获的字符串

[^/]就是表示除了/以外的字符串,以上面为例,共有“C:”、“Users”、"asus"、"Desktop"、"nefertiti_4465.obj"与之匹配.

但是后面又加上了“\\..+”分别表示‘.’和含至少一个字符的字符串。因此匹配出的结果就是“nefertiti_4465.obj”。

其实也可以采用QRegExp rx1("[^/]+$"),表示从最后一个字符开始匹配,因此就是“nefertiti_4465.obj” ,至于cap()的用法可以查Qt的语法书。

2.采用新的正则表达式匹配

QString filename1;QString filename2;if ((rx2.indexIn(filename1)!=-1)&&(rx2.indexIn(filename2)!=-1)){..... //匹配成功,是一类文件}

参考文献:

1.《Qt Creator 快速入门》(第2版)7.3正则表达式 -------------讲的非常好!

2. “正则表达式 怎么匹配文件名?”

3. 正则表达式演示网址

4. Qt中的正则表达式

5.Qt之正则表达式 - QRegExp

附注:

标准的正则表达式因为出现一些特殊字符,在C/C++代码里使用时,必须进行转换。例如:"(\S+)\s*=\s*(\S*)"必须转换成"(\\S+)\\s*=\\s*(\\S*)"

Qt的SDK里包含一个很帮的GUI工具,可以方便我们进行这类转换并测试你的表达式。

可以在如下链接中下载:/s/1o6jFk2A

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。