删除文件名后缀的正则表达式是什么?例如,如果我在字符串中有一个文件名,例如“vnb.txt”,那么删除“.txt”的正则表达式是什么? 感谢。
答案 0 :(得分:4)
你真的需要一个正则表达式吗?为什么不直接查找字符串中的最后一个句点,并将字符串修剪到该点?坦率地说,正则表达式有很多开销,在这种情况下我认为你不需要它。
根据tstenner的建议,您可以尝试以下其中一项,具体取决于您使用的字符串类型:
第一个例子:
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扩展名。