删除后缀的正则表达式

问题描述:

删除文件名后缀的正则表达式是什么?例如,如果我在诸如“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

不同的操作系统可能允许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

你真的需要一个正则表达式来做到这一点吗?为什么不只是查找字符串中的最后一个时间段,并将字符串修剪到该点?坦率地说,正则表达式有很多开销,在这种情况下我不认为你需要它。

正如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

如果您正在寻找能够为您提供除后缀以外的任何解决方案的解决方案,则应使用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); 
} 

如果你正在寻找一个正则表达式,使用\.[^.]+$
你必须逃避第一个.,否则它将匹配任何字符,并在最后放置一个$,所以它只会匹配一个字符串的末尾。

如果您已经使用Qt,您可以使用QFileInfo,并使用baseName()功能得到公正的名称(如果存在的话),或者suffix()功能得到扩展名(如果存在的话)。