使用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_k2 QString pattern=(simple_filename)+"..+"; //构造新的正则表达式,例如:匹配nefertiti_4465_k1.txt或者nefertiti_4465_k2.txt QRegExp 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.obj QString 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*)" 可以在如下链接中下载:http://pan.baidu.com/s/1o6jFk2A (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |