如何在c ++中使用regex替换文件名的扩展名?

时间:2014-01-21 07:33:44

标签: c++ regex

我想将文件扩展名从.nef替换为.bmp。我如何使用正则表达式?

我的代码就像 -

string str("abc.NEF");
regex e("(.*)(\\.)(N|n)(E|e)(F|f)");
string st2 = regex_replace(str, e, "$1");
cout<<regex_match (str,e)<<"REX:"<<st2<<endl;

regex_match (str,e)让我受到了欢迎,但st2变成了空白。我对正则表达式不太熟悉,但我希望在st2中出现一些内容。我做错了什么?

5 个答案:

答案 0 :(得分:1)

试试这个。

它将匹配.NEF或.nef

string str("abc.NEF");
regex e(".*(\.(NEF)|\.(nef))");
string st2 = regex_replace(str,e,"$1");

$ 1将捕获.NEF or .nef

check here

答案 1 :(得分:0)

试试这个

 string test = "abc.NEF";
 regex reg("\.(nef|NEF)");
 test = regex_replace(test, reg, "your_string");

答案 2 :(得分:0)

我建议不要使用正则表达式来完成这么简单的任务。 试试这个功能:

#include <string>
#include <algorithm>

std::string Rename(const std::string& name){
    std::string newName(name);
    static const std::string oldSuffix = "nef";
    static const std::string newSuffix = "bmp";
    auto dotPos = newName.rfind('.');
    if (dotPos == newName.size() - oldSuffix.size() - 1){
        auto suffix = newName.substr(dotPos + 1);
        std::transform(suffix.begin(), suffix.end(), suffix.begin(), ::tolower);
        if (suffix == oldSuffix)
            newName.replace(dotPos + 1, std::string::npos, newSuffix);
    }
    return newName;
}

首先我们找到分隔符位置,然后获取整个文件扩展名(suffix),将其转换为小写并与oldSuffix进行比较。

当然,您可以将oldSuffixnewSuffix设置为参数,而不是静态参数。 这是一个测试程序:http://ideone.com/D09NVL

答案 3 :(得分:0)

我认为使用

提供最简单,最易读的解决方案
auto result = boost::algorithm::ireplace_last_copy(input, ".nef", ".bmp");

答案 4 :(得分:-1)

我想这个

string str("abc.NEF");
regex e("(.*)\\.[Nn][Ee][Ff]$");
string st2 = regex_replace(str, e, "$1.bmp");
cout<<regex_match(str, e)<<"REX:"<<st2<<endl;

会为你做得更好。