正则表达式是一种处理字符串强有力的工具,在先前用Python做NLP相关的工作时,曾使用Python的正则库(re)进行数据的清洗,最近在做图像处理时需要多次存储处理后的文件,多次指定路径过于麻烦,便想到了使用正则表达式对输入文件的路径进行分解,以便将处理后的文件存储于输入文件相同的上级目录中。
1、正则表达式的简介以及基本方法
关于正则表达式的相关背景介绍以及基本方法,这里不赘述,详情请看菜鸟网站。
2、在C++中使用正则表达式的方法
#include <regex> //引入正则表达式头文件
#include <iostream>
using namespace std;
int main()
{
// 输入文件路径
string FilePath = "D:/VSCode-workspace/VSC_map_algebra/filebox/SourceFile.bmp";
// 定义正则表达式(获取输入文件的上级目录以及文件名称)
regex Pattern("(^.+\/)(.+).bmp", regex_constants::extended);
// 声明匹配结果变量
match_results<string::const_iterator> Result;
// 进行局部匹配
bool Valid = regex_search(FilePath, Result, Pattern);
if (Valid)
{
for (unsigned i = 0; i < Result.size(); i++)
cout << Result[i].str() << endl;
string temp = Result[1].str(); //使用smatch Result类中的str方法转化为string类
temp.append(Result[2].str() + "_Result.bmp"); //增加新的文件名
const char *Directory = temp.c_str(); //使用string类中的c_str方法转化为const char*类型
cout << Directory << endl;
return 1;
}
cout << "False" << endl;
return 0;
}
以上代码根据输入的.bmp文件的路径,获取了文件的名称(不含后缀名)以及文件所在的上级目录,输出结果如下:

在C++使用regex库中的正则表达式基本方法见代码段main函数的前四行,这里比较关键的是第二行中定义的正则表达式模式:

绿色双引号之间的部分是我们需要按照需求自己定义的正则表达式,其中第一个括号对应结果Result[1]中的值,第二个括号对应结果Result[2]中的值,Result[0]默认会将查找结果拼合起来,可以忽略。对于表达式的具体解释,这里不详述,可见菜鸟网站;对于regex正则表达式更加详细的使用方法,可见链接。
3、将获取路径(字符串)进行处理
因为需要进行文件的读写,这里需要将Smatch Result类型的变量转换为const char *类型,我使用的方法如下:

4、实现其它功能的一些正则表达式模式
// 获取输入文件的上上级目录,位于Result[1]中
regex Pattern_1("(^.+\/)(.+)\/(.+).bmp", regex_constants::extended);
// 获取输入文件的上上上级目录,位于Result[1]中
regex Pattern_2("(^.+\/)(.+)\/(.+)\/(.+).bmp", regex_constants::extended);
// 获取输入文件的根目录,位于Result[1]中
regex Pattern_3("(^.+?\/)(.+).bmp", regex_constants::extended);
// 获取输入文件的名称(含后缀名),位于Result[2]中
regex Pattern_4("(.+\/)(.+.bmp)", regex_constants::extended);