用于删除后缀的正则表达式

时间:2011-03-29 19:24:32

标签: c++ regex qt4

删除文件名后缀的正则表达式是什么?例如,如果我在字符串中有一个文件名,例如“vnb.txt”,那么删除“.txt”的正则表达式是什么? 感谢。

4 个答案:

答案 0 :(得分: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('.');

答案 1 :(得分: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 :(得分:2)

如果您已经使用Qt,可以使用QFileInfo,并使用baseName()函数获取名称(如果存在)或suffix()函数以获取扩展(如果存在)。

答案 3 :(得分:0)

不同的操作系统可能允许文件名中包含不同的字符,最简单的正则表达式可能是(.+)\.txt$。获取第一个捕获组以获取文件名sans扩展名。