2016-10-21 42 views
0

正則表達式獲取文件夾我有這樣C++從文件路徑

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

文件名如何與*使用正則表達式,所以我得到

/mnt/opt/storage/ssd/subtitles/8/vtt/*替換的文件名?

我知道簡單的循環拆分或boost::filesystem的方法,我正在尋找regex_replace方法。

+1

我建議*試圖*而不僅僅是*尋找*。你有沒有拿出任何代碼到目前爲止? –

回答

5

你不需要正則表達式此:

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(), "*"); 
2

嘗試此圖案

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

在記事本中測試++。

(?=())它的表情。因此,只有在.xxx或.xx格式的擴展名(。\ w {2,3))位於該組之後時,它纔會匹配([\ w + - ])+。 在C++中,你必須將組替換成*類似 替換(字符串,$ 1,'*') - 我不知道C++替換函數,只是假設。

$ 1,$ 2,$ 3 ...它的組號,在這種情況下 - $ 1它(([\ w + - ])+)。

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 /選擇/存儲/ ssd/subtitles/8/vtt/2011022669-5126858992107.vtt /mnt/opt/storage/ssd/subtitles/8/vtt/*

但是,...正則表達式似乎是這樣簡單的更換有點過重的重量