2011-03-29 125 views
0

刪除文件名後綴的正則表達式是什麼?例如,如果我在諸如「vnb.txt」的字符串中有文件名,那麼刪除「.txt」的正則表達式是什麼? 謝謝。刪除後綴的正則表達式

+2

爲什麼這個問題標記爲C++或qt4? – 2011-03-29 19:37:50

+0

@John Dibling:我想這是因爲OP也在使用Qt4和C++。如果有針對Qt4/C++的解決方案,我想可能會比通用的解決方案更受歡迎。 – FrustratedWithFormsDesigner 2011-03-29 20:04:15

+0

你怎麼知道一點後。真的是後綴? 「.hidenfile」多個後綴怎麼樣? 「foo.bar.tar.gz」操縱文件名的最終目的是什麼? – 2011-03-29 21:10:28

回答

0

不同的操作系統可能允許filenams中的不同字符,最簡單的正則表達式可能是(.+)\.txt$。獲取第一個捕獲組以獲取文件名sans擴展名。

+0

要匹配任何文件擴展名,不只是'.txt',請使用'(。+)\。([^ \。] +)'(如果不匹配,則文件名無擴展名) – 2011-03-29 19:47:28

+0

@ Felix Dombek:您還需要能夠處理文件名,例如'ENV1.20110329.dat' ......我認爲您的模式可以捕獲ENV1和20110329,但不會得到文件擴展名「.dat」。 – FrustratedWithFormsDesigner 2011-03-29 20:02:20

+1

不,如果第一個捕獲組未被指定爲不情願('(\。+?)')。但是如果你想確定,你當然可以使用'^'和'$':完整的正則表達式是'^(。+)\。([^ \。] +)$' – 2011-03-30 11:11:21

4

你真的需要一個正則表達式來做到這一點嗎?爲什麼不只是查找字符串中的最後一個時間段,並將字符串修剪到該點?坦率地說,正則表達式有很多開銷,在這種情況下我不認爲你需要它。

正如tstenner建議,可以嘗試以下操作之一,這取決於你使用的是什麼類型的字符串:

std::strrchr

std::string::find_last_of

第一個例子:

char* str = "Directory/file.txt"; 

size_t index; 
char* pStr = strrchr(str,'.'); 
if(nullptr != pStr) 
{ 
    index = pStr - str; 
} 

第二個例子:

int index = string("Directory/file.txt").find_last_of('.'); 
+0

對於文件名是真的,但不適用於路徑名稱。 – khachik 2011-03-29 19:33:44

+2

您可能想要添加對string :: find_last_of的引用。 – tstenner 2011-03-29 19:50:15

2

如果您正在尋找能夠爲您提供除後綴以外的任何解決方案的解決方案,則應使用string::find_last_of

您的代碼看起來是這樣的:


const std::string removesuffix(const std::string& s) { 
    size_t suffixbegin = s.find_last_of('.'); 

    //This will handle cases like "directory.foo/bar" 
    size_t dir = s.find_last_of('/'); 
    if(dir != std::string::npos && dir > suffixbegin) return s; 
    if(suffixbegin == std::string::npos) return s; 
    else return s.substr(0,suffixbegin); 
} 

如果你正在尋找一個正則表達式,使用\.[^.]+$
你必須逃避第一個.,否則它將匹配任何字符,並在最後放置一個$,所以它只會匹配一個字符串的末尾。

2

如果您已經使用Qt,您可以使用QFileInfo,並使用baseName()功能得到公正的名稱(如果存在的話),或者suffix()功能得到擴展名(如果存在的話)。