c ++ regex从文件路径获取文件夹

时间:2016-10-21 08:16:01

标签: c++ regex

我有一个像这样的文件名

/mnt/opt/storage/ssd/subtitles/8/vtt/2011022669-5126858992107.vtt

如何使用正则表达式用*替换文件名,所以我得到了

/mnt/opt/storage/ssd/subtitles/8/vtt/*

我知道简单的for循环拆分或boost::filesystem方法,我正在寻找regex_replace方法。

3 个答案:

答案 0 :(得分:5)

你不需要regexp:

string str = "/mnt/opt/storage/ssd/subtitles/8/vtt/2011022669-5126858992107.vtt";
auto lastSlash = str.find_last_of('/');
str.replace(str.begin() + lastSlash + 1, str.end(), "*");

答案 1 :(得分:2)

尝试这种模式

(([\w+\-])+)(?=(\.\w{3}))

在记事本++中测试。

(?=())它的外观。因此,只有格式为.xxx或.xx的扩展名(。\ w {2,3))在此组之后才匹配([\ w + - ])+。 在c ++中,你必须将group替换为类似的东西 替换(字符串,$ 1,' *') - 我不知道c ++替换funciton,只是假设。

$ 1,$ 2,$ 3 ...其组号,在这种情况下 - $ 1(([\ w + - ])+)。

答案 2 :(得分:2)

以下是regexp_replace [live]的解决方案:

   std::string path = "/mnt/opt/storage/ssd/subtitles/8/vtt/2011022669-5126858992107.vtt";
   std::regex re(R"(\/[^\/]*?\..+$)");

   std::cout << path << '\n';
   std::cout << std::regex_replace(path, re, "/*") << '\n';

输出:

  

/mnt/opt/storage/ssd/subtitles/8/vtt/2011022669-5126858992107.vtt   的/ mnt /选择/存储/ SSD /字幕/ 8 / VTT / *

但是,... regexp对于这种简单的替换来说似乎有点太重了