正则匹配文件后缀的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则匹配文件后缀的问题相关的知识,希望对你有一定的参考价值。
需要用正则过滤指定类型文件,比如:“Gamma Panel 1.0.0.20 汉化版.exe”这个文件名,因为文件名中含有多个点号,导致用过许多正则表达式都无法过滤这个exe文件,我的本意是要过滤所有exe类型的文件,但是对这种文件名中含有点号的根本就不起作用。希望高手能帮帮我!
这个,你就不能直接截取最后四位然后和”.exe“比较么?如果你执意要用正则:^.+\.exe$
".+"表示匹配至少一个任意字符,“\.”匹配点。亲测可用,注意匹配正则要忽略大小写 ignore case 参考技术A 使用限定符,只取最后一次匹配到的.exe就行了 参考技术B 去所有路径中的后缀:\.[^ .]+$
所以针对某种具体的文件类型更简单:\.exe$
c++ 使用正则匹配url
stl regex
stl 中regex 非常好用,即使不用boost库也可以很轻易地且高效地摘取你想要的内容,这里提供一个class
解析出 a href 的文件名路径和文件名和文件后缀名
另外需要解析url的朋友可以看这篇文章:
解析url的代码
代码 show me the code
/*
author:qianbo
date :2014-11-06
功能 :解析html A href 取出其中的连接,解析出全路径 文件前缀 文件后缀
*/
#include <regex>
#include <string>
#include <iostream>
#include <fstream>
#include <functional>
#include <windows.h>
using namespace std;
typedef struct dataHtmlFile
{
string s1; //全路径
string filePrefix; //文件前缀
string fileSuffix; //带dot的文件后缀 如 .png .jpg
}dataHtmlFile;
template <class Type>
class PrintString
{
public:
PrintString()
{
}
void operator ( ) ( Type& elem ) const
{
cout<<"the value is "<<elem.s1<<" "<<elem.filePrefix<<" "<<elem.fileSuffix <<endl;
//elem *= Factor;
}
};
class PrintString2
{
public:
PrintString2()
{
}
void operator ()(string& elem) const
{
cout<<"now it is "<<elem<<endl;
}
void print()
{
}
};
class DGIRegex
{
private:
public:
//检测是否是电话格式
static int isPhoneNumber(string strPhone)
{
static string g_strPhone = "0\\\\d{2}-\\\\d{8}";
std::tr1::cmatch res1;
std::tr1::regex rx(g_strPhone);
if(std::tr1::regex_search(strPhone.c_str(), res1, rx))
return 0;
return -1;
}
//得到全路径
static int get_exe_path(string& strPath)
{
char szPath[260];
if( !GetModuleFileNameA(NULL, szPath, 260 ) )
{
return -1;
}
else
{
(strrchr(szPath,'\\\\'))[1] = 0;
//(_tcsrchr(szPath, '\\\\'))[1] = 0;
strPath = szPath;
return 0;
}
}
protected:
int UseIter(string& html,vector<dataHtmlFile>& links);
int UseSearch(string& html,vector<dataHtmlFile>& links);
public:
int RegexSearchLinkFile(string& html,int isFile,vector<dataHtmlFile>& Links);
public:
DGIRegex(void);
~DGIRegex(void);
};
实现
int DGIRegex::UseIter(string& html,vector<dataHtmlFile>& links)
{
tr1::regex rxHtmlB("<A HREF=\\"([^>]+)\\">",tr1::regex::icase); //<a[^>]+>
tr1::sregex_token_iterator ite(html.begin(), html.end(), rxHtmlB), end;
tr1::regex rx("\\"([^\\"]+)\\"");
int i = 0;
for ( ; ite != end; ++ite)
{
string strfind = ite->str();
//cout << ite->str() << endl;
tr1::cmatch res;
if(std::tr1::regex_search(strfind.c_str(),res,rx))
{
//cout<<res[1]<<endl;
//links.push_back(res[1]);
i++;
}
}
return i;
}
int DGIRegex::UseSearch(string& html,vector<dataHtmlFile>& links)
{
tr1::smatch m;
tr1::regex rxHtml("<A\\\\s+HREF\\\\s*=\\\\s*\\"([^>]+)\\">(\\\\w+)(\\\\.[^<]+)</A>",tr1::regex::icase);
string source = html;
int i = 0;
while (tr1::regex_search (source,m,rxHtml)) {
//for (auto x:m) std::cout << x << " ";
//cout<<m[0];
//std::cout << std::endl;
//cout<<"this is total "<<m.size()<<endl;
dataHtmlFile dhtmlf;
dhtmlf.s1 = m[1];
dhtmlf.filePrefix = m[2];
//文件后缀赋值
dhtmlf.fileSuffix = m[3];
links.push_back(dhtmlf);
++i;
source = m.suffix().str();
}
return i;
}
/*输入html 的字符串或者html的名字*/
int DGIRegex::RegexSearchLinkFile(string& html,int isFile,vector<dataHtmlFile>& Links)
{
string fileContent = html;
if(isFile == 1) //如果是文件,html是文件民称
{
//fstream eam(html);
ifstream in(html.c_str(), ios::in|ios::binary);
if(in.is_open())
{
string temp;
while(getline(in,temp))
{
fileContent += temp;
}
in.close();
return UseSearch(fileContent,Links);
}
}
return UseSearch(fileContent,Links);
}
测试程序
int main()
{
DGIRegex regex;
vector<dataHtmlFile> test;
regex.RegexSearchLinkFile(string("c:\\\\test2.html"),1,test);
std::for_each(test.begin(), test.end(),PrintString<dataHtmlFile>());
return 0;
}
以上是关于正则匹配文件后缀的问题的主要内容,如果未能解决你的问题,请参考以下文章